天天看點

【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--];
            }
        }
    }
};