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的复杂度;