今日算法:三数之和

题目(来源于力扣)

思路

排序+双指针+去重 解决三数之和问题

代码

var threeSum = function(nums) {
  // 将数组nums升序排序
  nums.sort((a,b)=>a-b);
  let arr = [];
  for(let i = 0;i < nums.length-2;i++){
    // 左指针
    let left = i+1;
    // 右指针
    let right = nums.length-1;
    // 数组升序,如果三数中第一个数就大于0,直接返回arr
     if(nums[i] > 0) return arr;
    //  三数中的第一个数nums[i]去重
     if(i > 0 && nums[i]==nums[i-1]) continue;
    //  循环找其他两个数
     while(left < right){
       let sum = nums[i]+nums[left]+nums[right];
       if(sum > 0){
          right--;
        }else if(sum < 0){
          left++;
        }else{
          arr.push([nums[i],nums[left],nums[right]])
          // 对另外两个数nums[left]和nums[right]去重
          while(left < right && nums[left] == nums[left + 1]){
              left++;
          }
          while(left < right && nums[right] == nums[right - 1]) {
              right--;
          }
          left++;
          right--;
        }
     }
  }
  return arr;
};

分析图

以nums=[-1,0,1,2,-1,-4]为例

 

注意点 

1、对于nums[i]的去重是nums[i]==nums[i-1]而不是nums[i]==nums[i+1],防止nums=[-1,-1,2]这种情况,若为nums[i]==nums[i+1],则会跳过[-1,-1,2]这种满足条件的三元组

2、对于nums[left]和nums[right]的去重要放在arr.push()之后,防止nums=[0,0,0,0]这种会导致没有结果返回

猜你喜欢

转载自blog.csdn.net/weixin_53141315/article/details/132650815