三数之和
满足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+1function 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}