• 4Sum


    Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

    Note:

    • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
    • The solution set must not contain duplicate quadruplets.
        For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
    
        A solution set is:
        (-1,  0, 0, 1)
        (-2, -1, 1, 2)
        (-2,  0, 0, 2)

    分析:和3Sum的做法类似,将数组排序后,固定第一、二个数,然后从两边夹逼第三、四个数。注意检查重复数字出现的情况。

    Solution1: 运行时间129ms。

     1 class Solution {
     2 public:
     3     vector<vector<int> > fourSum(vector<int>& nums, int target) {
     4         vector<vector<int> >result;
     5         if(nums.size() < 4) return result;
     6         sort(nums.begin(), nums.end());
     7         
     8         for(int a = 0; a < nums.size() - 3; a++){
     9             if(a != 0 && nums[a] == nums[a-1]) continue;
    10             for(int b = a + 1; b < nums.size() - 2; b++){
    11                 if(b != a + 1 && nums[b] == nums[b-1]) continue;
    12                 int c = b + 1, d = nums.size() - 1;
    13                 
    14                 while(c < d){
    15                     if(nums[a] + nums[b] + nums[c] + nums[d] > target) d--;
    16                     else if(nums[a] + nums[b] + nums[c] + nums[d] < target) c++;
    17                     else{
    18                         if(c != b + 1 && nums[c] == nums[c-1]) c++;
    19                         else if(d != nums.size() - 1 && nums[d] == nums[d+1]) d--;
    20                         else{
    21                             result.push_back({nums[a], nums[b], nums[c], nums[d]});
    22                             c++;
    23                             d--;
    24                         }
    25                     }
    26                 }
    27             }
    28         }
    29         sort(result.begin(), result.end());
    30         return result;
    31     }
    32 };

    Solution2:用map进行存储与判断,耗时更多。160ms。不推荐。

     1 class Solution {
     2 public:
     3     vector<vector<int> > fourSum(vector<int>& nums, int target) {
     4         vector<vector<int> >result;
     5         if(nums.size() < 4) return result;
     6         sort(nums.begin(), nums.end());
     7         
     8         for(int a = 0; a < nums.size() - 3; a++){
     9             if(a != 0 && nums[a] == nums[a-1]) continue;
    10             for(int b = a + 1; b < nums.size() - 2; b++){
    11                 if(b != a + 1 && nums[b] == nums[b-1]) continue;
    12                 int c = b + 1, d = nums.size() - 1;
    13                 map<int, int> hmap;
    14                 
    15                 while(c < d){
    16                     if(nums[a] + nums[b] + nums[c] + nums[d] > target) d--;
    17                     else if(nums[a] + nums[b] + nums[c] + nums[d] < target) c++;
    18                     else{
    19                         if(hmap.find(nums[c]) == hmap.end()){
    20                             hmap[nums[c]] = nums[d];
    21                             result.push_back({nums[a], nums[b], nums[c], nums[d]});
    22                         }
    23                         c++;
    24                         d--;
    25                     }
    26                 }
    27             }
    28         }
    29         sort(result.begin(), result.end());
    30         return result;
    31     }
    32 };
    View Code
  • 相关阅读:
    setTimeout 理解
    Git 使用规范流程
    JavaScript异步编程 ( 一 )
    javaScript模块化一
    javascript 知识点坑
    javaScript闭包
    函数式编程
    JavaScript的68个技巧一
    MySql 隐式转换
    MySQL优化
  • 原文地址:https://www.cnblogs.com/amazingzoe/p/4494995.html
Copyright © 2020-2023  润新知