三数之和

  1. 满足a+b+c=0
  2. 输入:[-10,0,10,20,-10,-40]
  3. 返回值:[[-10,-10,20],[-10,0,10]]
  1. // 1、先排序
  2. // 2、确定第一项(注意第一项区间),后面项左右双指针移动
  3. // 3、跳过重复项(去重)
  4. function threeSum( num ) {
  5. if(num.length<3) return []
  6. num.sort((a,b)=>a-b);
  7. if (num[0]>0) return []
  8. let res = [];
  9. // [i,left,right]
  10. for (let i = 0;i<num.length-2;i++) {
  11. let left = i+1;
  12. let right = num.length-1;
  13. while (left < right) {
  14. let target = 0 - num[left]-num[right];
  15. if (target>num[i]) left++;
  16. if (target<num[i]) right--;
  17. if(num[i]===target) {
  18. let arr = [target,num[left],num[right]]
  19. res.push(arr);
  20. // 过滤重复的值
  21. while(num[left]===num[left+1]) left++;
  22. while(num[right]===num[right-1]) right--;
  23. left++;
  24. right--;
  25. }
  26. }
  27. // 过滤重复的值
  28. while(num[i]===num[i+1]) i++;
  29. }
  30. return res
  31. }

非连续最小正整数

  1. 输入:[-2,3,4,1,5]
  2. 返回值:2
  1. // 两次遍历:
  2. // 第一次用map记录所有的整数;
  3. // 第二次从[1,len]范围内没出现过的数字,
  4. // 如果都出现过了,说明数组为连续数组[1,len],这时取len+1
  5. function minNumberDisappeared( nums ) {
  6. let len = nums.length;
  7. let cache = new Map();
  8. for(let i = 0;i<len;i++) {
  9. cache.set(nums[i],true)
  10. }
  11. for(let i = 1;i<len;i++) {
  12. if(!cache.has(i)) return i
  13. }
  14. return len+1
  15. }