leetcode 15 三数之和

45 阅读1分钟

第一遍写有一定的思路,但是就是写不出来。参考第一个题解,写一个c++版本 主要思路为排序+双指针 size < 3 直接返回

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        int n = nums.size();
    
        for(int i = 0; i < n - 2; i++) {
            // 当迭代中的最小的一个元素都大于0,数组后面的元素肯定也都大于0,所以已经可以直接返回了
            if(nums[i] > 0) {
                return result;
            }
            // i > 0 是为了避免初始化i=0的时候判断
            // 如果没有 i > 0的话,会出现num[-1],数组越界,error
            if(i > 0 && nums[i] == nums[i-1]) {
                // 去除重复的,两种情况:一种这个i找到了sum = 0,去除重复值;未找到,这个未找到,相等的value也一定找不到
                continue;
            }
            int j = i + 1;
            int k = n - 1;
            while(j < k) {
                int sum = nums[i] + nums[j] + nums[k];
                if(sum == 0) {
                    // 可以记忆一下
                    // 一个vector{1, 1, 1}或者{'1', '2', '3'}
                    result.push_back({nums[i], nums[j], nums[k]});
                    // 避免重复
                    while(j < k && nums[j] == nums[j+1]) {
                        j++;
                    }
                    // 避免重复
                    while(j < k && nums[k] == nums[k-1]) {
                        k--;
                    }
                    // 需要j++ k++是因为指针还未脱离重复值,自己细品...
                    j++;
                    k--;
                }
                // 太大了
                // 这个我在思考能不能同样去重重复值
                // 比如[-2, 0, 1, 1, 4, 4],去除4 4
                else if(sum > 0) {
                    k--;
                }
                // 太小了
                else {
                    j++;
                }
            }
        }
        return result;
    }
};