经过笔者的慎重考虑 决定改变leetcode的刷题方式。沿用分类刷题方式。看了些相关的文章推荐,整理了如下的刷题整理,如有不足之处,望指出。
- 排序算法
- 双指针 & 滑动窗口
- 利用Map 与 Set 处理查找表问题
- 链表算法
- 递归 与 二叉树算法
- 栈 队列 DFS BFS 算法
- 回溯算法
- 贪心算法
- 动态规划
- 广度 深度优先算法
- ...
最后:笔者最近在整理自己的知识体系,之前的博客因为服务器到期了(就不打算续费了),现在转到了语雀。笔者整理好之好,会做一篇分享。如有不足之处,希望大伙踊跃指出。
好了 ,以下是今天的排序算法题目:三数之和
给你一个包含 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
};