三数之和
满足a+b+c=0
输入:[-10,0,10,20,-10,-40]
返回值:[[-10,-10,20],[-10,0,10]]
// 1、先排序
// 2、确定第一项(注意第一项区间),后面项左右双指针移动
// 3、跳过重复项(去重)
function threeSum( num ) {
if(num.length<3) return []
num.sort((a,b)=>a-b);
if (num[0]>0) return []
let res = [];
// [i,left,right]
for (let i = 0;i<num.length-2;i++) {
let left = i+1;
let right = num.length-1;
while (left < right) {
let target = 0 - num[left]-num[right];
if (target>num[i]) left++;
if (target<num[i]) right--;
if(num[i]===target) {
let arr = [target,num[left],num[right]]
res.push(arr);
// 过滤重复的值
while(num[left]===num[left+1]) left++;
while(num[right]===num[right-1]) right--;
left++;
right--;
}
}
// 过滤重复的值
while(num[i]===num[i+1]) i++;
}
return res
}
非连续最小正整数
输入:[-2,3,4,1,5]
返回值:2
// 两次遍历:
// 第一次用map记录所有的整数;
// 第二次从[1,len]范围内没出现过的数字,
// 如果都出现过了,说明数组为连续数组[1,len],这时取len+1
function minNumberDisappeared( nums ) {
let len = nums.length;
let cache = new Map();
for(let i = 0;i<len;i++) {
cache.set(nums[i],true)
}
for(let i = 1;i<len;i++) {
if(!cache.has(i)) return i
}
return len+1
}