方针:
- sort数组
- 固定前三个(i1,i2,i3初始化,逐次偏移+1),从后往前移动最后一个(i4)。
- 判断4数之和==target break;
问题:
1. 数组含有重复数字
解决:if(ix==ix-1) then continue;
2.优化:执行时间长
解决:
过滤1,if(i1+..+ix 和其之后的连续n-x个数之和>target) then break;
过滤2,if(i1+..+ix 和最后n-x个数之和<target) then continue(使得ix++,来增大ix);
1 class Solution { 2 public: 3 static bool sortfun(const int a, const int b){ 4 return a<b; 5 } 6 vector<vector<int>> fourSum(vector<int>& nums, int target) { 7 int i1,i2,i3,i4,n=nums.size(); 8 vector<vector<int>> res={}; 9 if(n<4) return res; 10 sort(nums.begin(), nums.end(), sortfun); 11 for(i1=0; i1<n-3; i1++){ 12 if(i1>0 && nums[i1] == nums[i1-1]) continue; 13 if(nums[i1]+nums[i1+1]+nums[i1+2]+nums[i1+3]>target) break; 14 if(nums[i1]+nums[n-3]+nums[n-2]+nums[n-1]<target) continue; 15 for(i2=i1+1; i2<n-2; i2++){ 16 if(i2>i1+1 && nums[i2] == nums[i2-1]) continue; 17 if(nums[i1]+nums[i2]+nums[i2+1]+nums[i2+2]>target) break; 18 if(nums[i1]+nums[i2]+nums[n-2]+nums[n-1]<target) continue; 19 for(i3=i2+1; i3<n-1; i3++){ 20 if(i3>i2+1 && nums[i3] == nums[i3-1]) continue; 21 if(nums[i1]+nums[i2]+nums[i3]+nums[i3+1]>target) break; 22 if(nums[i1]+nums[i2]+nums[i3]+nums[n-1]<target) continue; 23 for(i4=n-1; i4>i3; i4--){ 24 if(nums[i1]+nums[i2]+nums[i3]+nums[i4]==target){ 25 res.push_back({nums[i1],nums[i2],nums[i3],nums[i4]}); 26 break; 27 } 28 } 29 } 30 } 31 } 32 return res; 33 } 34 };