zoukankan      html  css  js  c++  java
  • 15. 3Sum

    15. 3Sum

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

    Note: The solution set must not contain duplicate triplets.

    For example, given array S = [-1, 0, 1, 2, -1, -4],
    
    A solution set is:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]
     1 /**
     2  * @param {number[]} nums
     3  * @return {number[][]}
     4  */
     5 var threeSum = function(nums) {
     6     
     7     //和two sum的解法一样,只不过多个循环,还有一点,注意要去重。  
     8     var len = nums.length;
     9     
    10     var res = [];
    11 
    12     
    13     //这里有个坑,就是sort函数对于负数,是根据绝对值排的,不行你们试试 [-4,-2,-2]变成了[-2,-2,-4];
    14     //所以这里我加了个callback
    15     nums.sort(function(a,b){ return a-b;});
    16     
    17     for(var i = 0;i<len;i++){
    18         
    19         //这就变成two sums问题
    20         var target = 0 - nums[i];
    21         
    22         var left = i + 1; var right = len - 1;
    23         
    24         
    25         //去重  比如   S = [-1, 0, 1, 2, -1, -4]  排序后变成 [-4,-1,-1,0, 1, 2]
    26             
    27         //第一种  i--> -4 j--> -1 k一直遍历都不行
    28             
    29         //第二种  i--> -4 j--> -1(这里其实往前走了一位的) j从0开始到2, 这种其实和第一遍一样,我们要去掉这种重复的。     
    30         
    31         //第三种  假如说 -1 0 1 已经是一组解了, 然后由于-1有2个数,这就造成重复解
    32         
    33         
    34         //双指针解法
    35         while(left < right){
    36                     
    37             var l = nums[left];
    38             var r = nums[right];
    39             var temp = l + r;
    40         
    41             //首先要保证一个解
    42              if(temp == target){
    43                  var subres = [];
    44                  subres.push(nums[i]);
    45                  subres.push(l);
    46                  subres.push(r);
    47                  
    48                  res.push(subres);
    49                                
    50                 //去重
    51                 while(nums[left] == nums[left+1]){
    52                 
    53                       left++;
    54               
    55                 }
    56             
    57                 while(nums[right] == nums[right-1]){
    58                 
    59                      right--;
    60               
    61                 }
    62                  
    63                  left++;
    64                  right--; 
    65                  
    66                 
    67              }else if(temp < target){
    68                  
    69                  left++;
    70                  
    71              }else{
    72                  
    73                  right--;
    74              } 
    75               
    76         }
    77         
    78         //去重
    79         while(i + 1 < len && nums[i] == nums[i+1]){
    80             
    81             i++;
    82         }
    83                         
    84     }
    85     return res;
    86 };
  • 相关阅读:
    随笔为什么还要想标题
    [GXYCTF2019]BabySQli
    [CISCN2019 华北赛区 Day2 Web1]Hack World
    20年美亚杯个人赛-ALICE_USB部分WRITE UP
    20年美亚杯个人赛-Alice LG Phone部分WRITE UP
    20年美亚杯个人赛-Alice_Laptop部分WRITE UP
    20年美亚杯WRITE UP
    18年美亚杯团体赛-C部分 WRITE UP
    v&n赛 ML 第一步(python解决)
    CTFHub web技能树 RCE
  • 原文地址:https://www.cnblogs.com/huenchao/p/7653357.html
Copyright © 2011-2022 走看看