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

  • 相关阅读:
    图灵2010.05书讯
    上海.NET技术交流会
    图灵2010.07书讯
    高效模式编写者的7个习惯
    QRCode 二维码开源DLL
    javascript 复习
    关于反射技术
    数字签名与加密解密
    使用负载均衡技术建设高负载的网络站点
    dreamweaver cs5.5中的phonegap升级测试
  • 原文地址:https://www.cnblogs.com/joelwang/p/10299690.html
Copyright © 2020-2023  润新知