leetCode第六题

125 阅读1分钟

经过笔者的慎重考虑 决定改变leetcode的刷题方式。沿用分类刷题方式。看了些相关的文章推荐,整理了如下的刷题整理,如有不足之处,望指出。

  1. 排序算法
  2. 双指针 & 滑动窗口
  3. 利用Map 与 Set 处理查找表问题
  4. 链表算法
  5. 递归 与 二叉树算法
  6. 栈 队列 DFS BFS 算法
  7. 回溯算法
  8. 贪心算法
  9. 动态规划
  10. 广度 深度优先算法
  11. ...

最后:笔者最近在整理自己的知识体系,之前的博客因为服务器到期了(就不打算续费了),现在转到了语雀。笔者整理好之好,会做一篇分享。如有不足之处,希望大伙踊跃指出。

好了 ,以下是今天的排序算法题目:三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组


/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let resArray = []
    // 预处理 小于3 直接return []
    if(nums.length < 3) return resArray;

     nums.sort((a,b)=>a - b)
    // 预处理 排序之后  如果第一项 >  0  或者 最后一项小于 0 则无法 得出值
     if(nums[0]> 0 || nums[nums.length - 1] < 0) return resArray;

    let len = nums.length;
     for(let i = 0; i< nums.length; i++){

         if(nums[i] > 0) return resArray;

        if(i > 0 && nums[i] === nums[i - 1]) continue;
        
        // 双指针
        let l = i+1;
        let r = len - 1;
        while(l < r){
            const res = nums[l] + nums[i] + nums[r];

            if(res > 0) r--;
            if(res < 0) l++;
            if(res === 0) {
                resArray.push([nums[l] , nums[i] , nums[r]]);

                while(l < r && nums[l] === nums[l+1]){
                    l ++
                }

                while(l< r && nums[r] === nums[r - 1]){
                    r--;
                }

                l++;
                r--;
            }

        }
     }

     return resArray
};

image.png