天天看点

【001】每日算法学习——day1数组

Question No.1

删除有序数组中的重复项

​​https://leetcode.cn/problems/remove-duplicates-from-sorted-array/​​

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = 0;
        for(int i = 0; i < nums.size(); i++){
            if(!i || nums[i] != nums[i-1]){
                nums[len] = nums[i];
                len++;
            }
        }
        return len;
    }
};      

小简化:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = 1;
        for(int i = 1;i < nums.size();i++){
            if(nums[i] != nums[i-1]) nums[len++] = nums[i];
        }
        return len;
    }
};      

Question No.2

移动零

​​https://leetcode.cn/problems/move-zeroes/​​

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int len = 0;
        for(int i = 0; i< nums.size(); i++){
            if(nums[i] != 0){
                nums[len] = nums[i];
                len++;
            }
        }
        while(len < nums.size()){
            nums[len] = 0;
            len++;
        }
    }
};      

Question No.3

合并两个有序数组

​​https://leetcode.cn/problems/merge-sorted-array/submissions/​​

第一种写法:
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        vector<int> res;
        int i = 0,j = 0;
        while(i < m || j < n){
            if(j >= n || (i < m && nums1[i] < nums2[j])){
                res.push_back(nums1[i++]);
            }else{
                res.push_back(nums2[j++]);
            }
        }
        for(int i = 0; i < m+n; i++) nums1[i] = res[i];
    }
};      

用额外空间来储存。最后再赋值给nums1数组。

第二种写法:
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i = m - 1,j = n - 1;
        for(int k = m + n - 1; k >= 0; k--){
            if(j < 0 || (i >= 0 && nums1[i] >= nums2[j])){
                nums1[k] = nums1[i--];
            }else{
                nums1[k] = nums2[j--];
            }
        }
    }
};