题外话:
这道题让我想起了
挑战程序设计竞赛有一个抽签问题,类似的a+b+c+d=target,可以重复使用一个数。
a+b+c+d=target转化为 a+b=target-c-d。 如果只是判断是否存在,那么可以预处理,得到所有c+d的值,然后binary_search (target-a-b)
处理方法
对于一个共有n个数的数组,准备一个数组int kk
kk[c*n+d]=k[c]+k[d]。
复杂度O(n^2log(n))
然后这道题:
就和前两个题差不多,先固定两个数,然后双指针法
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>>ret; if(nums.empty()) return ret; int len=nums.size(); if(len<4) return ret; sort(nums.begin(),nums.end()); for (int i = 0; i < len - 3; i++) { if (i > 0 && nums[i] == nums[i - 1]) continue; for(int j=i+1;j<len-2;j++){ if(nums[j]==nums[j-1]&&(j>i+1)) continue; int l = j + 1; int r = len - 1; while (l < r) { //多组 int s = nums[i] + nums[l] + nums[r]+nums[j]; if (s > target) r--; else if (s < target) l++; else { ret.push_back({nums[i], nums[j],nums[l], nums[r]}); while (l < r && nums[l] == nums[++l]); while (l < r && nums[r] == nums[--r]); } } } } return ret; } };