1 static int wing=[]()
 2 {
 3     std::ios::sync_with_stdio(false);
 4     cin.tie(NULL);
 5     return 0;
 6 }();
 7 
 8 class Solution 
 9 {
10 public:
11     vector<vector<int>> fourSum(vector<int>& nums, int target) 
12     {
13         int sz=nums.size();
14         vector<vector<int>> res;
15         if(sz<4)
16             return res;
17         sort(nums.begin(),nums.end());
18         int test=nums[sz-1]+nums[sz-2]+nums[sz-3];
19         for(int i=0;i<sz-3;i++)    //外循环,四和转三和
20         {
21             if(i>0&&nums[i]==nums[i-1])
22                 continue;
23             if(nums[i]+test<target)    //一段剪枝
24                 continue;
25             if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)      //二段剪枝
26                 return res;
27             int sum3=target-nums[i];
28             for(int j=i+1;j<sz-2;j++)     //内循环,求解三和
29             {
30                 if(j>i+1&&nums[j]==nums[j-1])
31                     continue;
32                 if(nums[i]+nums[j]+nums[sz-1]+nums[sz-2]<target)   //三段剪枝
33                     continue;
34                 if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)   //四段剪枝
35                     break;
36                 int sum2=sum3-nums[j];
37                 int left=j+1;
38                 int right=sz-1;
39                 while(left<right)  //求解二和
40                 {
41                     int cursum2=nums[left]+nums[right];
42                     if(cursum2==sum2)
43                     {
44                         res.push_back({nums[i],nums[j],nums[left],nums[right]});
45                         left++;
46                         while(left<right&&nums[left]==nums[left-1])
47                             left++;
48                         right--;
49                         while(left<right&&nums[right]==nums[right+1])
50                             right--;
51                     }
52                     else if(cursum2<sum2)
53                         left++;
54                     else
55                         right--;
56                 }
57             }
58         }
59         return res;
60     }
61 };

四和问题,转为三和问题,值得注意的是四段剪枝优化能使程序性能提升不少

posted on 2018-07-04 16:40  高数考了59  阅读(124)  评论(0)    收藏  举报