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 };
四和问题,转为三和问题,值得注意的是四段剪枝优化能使程序性能提升不少
浙公网安备 33010602011771号