18. 4Sum

方针:

  1. sort数组
  2. 固定前三个(i1,i2,i3初始化,逐次偏移+1),从后往前移动最后一个(i4)。
  3. 判断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 };

 

posted @ 2020-02-13 11:22  habibah_chang  阅读(127)  评论(0编辑  收藏  举报