美文网首页
力扣题解(数组)

力扣题解(数组)

作者: 衣介书生 | 来源:发表于2020-03-10 00:20 被阅读0次

26. 删除排序数组中的重复项

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

面试题 16.21. 交换和

class Solution {
public:
    vector<int> findSwapValues(vector<int>& array1, vector<int>& array2) {
        vector<int> res;
        int s1 = 0, s2 = 0;
        for (auto x: array1)
            s1 += x;
        for (auto x: array2)
            s2 += x;
        int d = s2 - s1;
        if (d % 2 != 0) return res;
        int share = d / 2;
        unordered_set<int> a1_set(array1.begin(), array1.end());
        for(auto e2: array2) {
            if (a1_set.count(e2 - share) > 0) {
                res.push_back(e2 - share);
                res.push_back(e2);
                break;
            }
        }
        return res;
    }
};

面试题 17.10. 主要元素

摩尔投票法

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int major = 0, cnt = 0;
        for (auto num : nums) {
            if (cnt == 0) {
                major = num;
                cnt ++;
            } else {
                if (num == major) {
                    cnt ++;
                } else {
                    cnt --;
                }
            }
        }
        // 验证
        cnt = 0;
        for (auto num: nums) {
            if (num == major) {
                cnt ++;
            }
        }
        if (cnt > nums.size() / 2)
            return major;
        else
            return -1;
    }
};

15. 三数之和

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int> > ans;
        if (nums.size() < 3) return ans;
        sort(nums.begin(), nums.end());  // 排序
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > 0)  // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
                break;
            if (i > 0 && nums[i] == nums[i - 1])  // 去重
                continue;
            int L = i + 1;
            int R = nums.size() - 1;
            while (L < R) {
                int sum = nums[i] + nums[L] + nums[R];
                if (sum == 0) {
                    vector<int> tmp = {nums[i], nums[L], nums[R]};
                    ans.push_back(tmp);
                    while(L < R && nums[L] == nums[L + 1]) L++;  // 去重
                    while(L < R && nums[R] == nums[R - 1]) R--;  // 去重
                    L++;
                    R--;
                } else if (sum < 0) {
                    L++;
                } else if (sum > 0) {
                    R--;
                }
            }
        }
        return ans;
    }
};

相关文章

网友评论

      本文标题:力扣题解(数组)

      本文链接:https://www.haomeiwen.com/subject/uugvdhtx.html