leetcode 18 四数之和

能运行却超时的代码。。。:

 1 class Solution {
 2 public:
 3     vector<vector<int>> fourSum(vector<int>& nums, int target) {
 4         vector<int> arr;//用来判断,降低时间消耗
 5         vector<vector<int>> res;
 6         sort(nums.begin(),nums.end());
 7         for(int i=0;i<nums.size();i++){
 8            arr.push_back(4*nums[i]-target);
 9         }
10         for(int h=0;h<nums.size()&&arr[h]<0;h++){
11             if(h>0 && arr[h]==arr[h-1]) continue;
12             for(int k=arr.size()-1;k>h && arr[k]>0;k--){
13                 int i=h+1,j=k-1;
14                 while(i<j){
15                     if(nums[h]+nums[i]+nums[j]+nums[k]<target){
16                         i++;
17                     }else if(nums[h]+nums[i]+nums[j]+nums[k]>target){
18                         j--;
19                     }else{
20                         res.push_back({nums[h],nums[i],nums[j],nums[k]});
21                         while(i<j+1 && nums[i]==nums[j]) i++;
22                         while(i<j+1 && nums[i]==nums[j]) j--;
23                     }
24                 }
25                 
26             }
27         }
28         return res;
29     }
30 };

 经过调整终于不超时的代码,24ms  beat84%

 1 class Solution {
 2 public:
 3     vector<vector<int>> fourSum(vector<int>& nums, int target) {
 4         set<vector<int>>res;
 5         sort(nums.begin(),nums.end());
 6         if( nums.empty()||4*nums[0]>target || (nums.size()>0 && 4*nums[nums.size()-1]<target) || nums.size()<4 ) return {};
 7         for(int h=0;h<nums.size()-3;h++){
 8             if(4*nums[h]>target) break;
 9             for(int i=h+1;i<nums.size()-2;i++){
10                 if(i>h+1 && nums[i]==nums[i-1]) continue;
11                 int j=i+1,k=nums.size()-1;
12                 while(j<k){
13                     int sum=nums[h]+nums[i]+nums[j]+nums[k];
14                     if(sum==target){
15                         vector<int> out{nums[h],nums[i],nums[j],nums[k]};
16                         res.insert(out);
17                         j++;k--;
18                     }else if(sum<target) j++;
19                     else k--;
20                 }
21             }
22         }
23         return vector<vector<int>>(res.begin(),res.end());
24     }
25 };

思想和3 sum一样,只不过是用两重循环从头开始遍历fix两个数,然后从剩下的数组中使用while首尾遍历,从而达到n3的复杂度;

原文地址:https://www.cnblogs.com/joelwang/p/10299690.html