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

  • 相关阅读:
    SpringMVC金课-课程大纲
    Type Cannot change version of project facet Dynamic Web Module to 3.0.
    使用maven 创建web项目 + 搭建SSM框架
    多文件上传
    asp.net 连接access数据库方法
    分享代码
    DIV+CSS解决IE6,IE7,IE8,FF兼容问题(转至http://www.douban.com/note/163291324/)
    asp.net发布网站(转)
    Img垂直居中
    http://www.apkbus.com/android-6231-1.html
  • 原文地址:https://www.cnblogs.com/joelwang/p/10299690.html
Copyright © 2020-2023  润新知