18. 四数之和

2021-08-25  本文已影响0人  gykimo

题目:https://leetcode-cn.com/problems/4sum/
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

我的方法一,4指针

https://leetcode-cn.com/problems/3sum/
三个数之和类似,也是先排序,只是4个数时,先固定2个数,移动另外两个指针,让和等于target

复杂度

时间:O(nxnxn),因为3层循环
空间:O(1)

代码

注意点

  1. 去重
  2. 4个int相加可能存在超过int最大值的问题,所以求和时要转为64位(long long)
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;

        //O(nlogn)
        sort(nums.begin(), nums.end());
        int n = nums.size();

        long long sum;
        int left;
        int right;

        //total O(nxnxn)
        //O(n)
        for(int i = 0; i < n; i++) {
            if(i > 0) {
                if(nums[i] == nums[i - 1]){
                    continue;
                }
            }
            
            //O(n)
            for(int j = i + 1; j < n; j++) {
                if(j > i + 1) {
                    if(nums[j] == nums[j - 1]){
                        continue;
                    }
                }

                left = j + 1;
                right = n - 1;

                //O(n)
                while(left < right) {
                    if(left > j + 1) {
                        if(nums[left] == nums[left - 1]){
                            left++;
                            continue;
                        }
                    }
                    if(right < n - 1) {
                        if(nums[right] == nums[right + 1]){
                            right--;
                            continue;
                        }
                    }

                    sum = (long long)nums[i] + (long long)nums[j] + (long long)nums[left] + (long long)nums[right];
                    if(sum == target) {
                        vector<int> tmp;
                        tmp.push_back(nums[i]);
                        tmp.push_back(nums[j]);
                        tmp.push_back(nums[left]);
                        tmp.push_back(nums[right]);
                        ret.push_back(tmp);
                        left++;
                    }else if(sum < target) {
                        left++;
                    }else{
                        right--;
                    }
                }
            }
        }

        return ret;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读