优化技巧:

  • 使用哈希做优化

题目:

1.前缀和

2.区间合并

图片.png

  1. function merge(list){
  2. list.sort((a,b)=>a[0]-b[0])//先按照每个区间的start位置排序
  3. let res = []
  4. res.push(list[0])
  5. for(let i=1;i<list.length;i++){
  6. let cur = list[i]
  7. let last = res[res.length-1]
  8. if(cur[0]<last[1]){
  9. last[1] = Math.max(last[1],cur[1])
  10. }else{
  11. res.push(cur);
  12. }
  13. }
  14. return res;
  15. }

3.区间交集

image.png

  1. function intervalSection(a,b){
  2. let i=0,j=0,res=[];
  3. while(i<a.length&&j<b.length){
  4. const ai = a[i],bj=b[j];
  5. if(b2>=a1&&a2>=b1){//存在交集的条件
  6. //具体交集区间的计算
  7. res.push([Math.max(ai[0],bj[0]),Math.min(ai[1],bj[1])])
  8. //指针的前进规则
  9. if(b2>a2){j++;}else{ i++;}
  10. }
  11. }
  12. return res;
  13. }

4.二维数组(FloodFill算法)

5.最长递增子序列(动态规划/扑克牌二分法)

image.png
image.png

  1. function maxEnvelops(envelops){
  2. const len = envelops.length;
  3. envelops.sort((a,b)=>{
  4. return a[0]===b[0]?(b[1]-a[1]):(a[0]-b[0]);
  5. });
  6. let heights = [];
  7. for(let i=0;i<len;i++){
  8. heights[i] = envelops[i][1];
  9. }
  10. return lengthOfLTS(heights);
  11. }
  12. // 放扑克牌方式,解释二分法
  13. /* 返回 nums 中 LIS 的长度 */
  14. public int lengthOfLIS(int[] nums) {
  15. int piles = 0, n = nums.length;
  16. int[] top = new int[n];
  17. for (int i = 0; i < n; i++) {
  18. // 要处理的扑克牌
  19. int poker = nums[i];
  20. int left = 0, right = piles;
  21. // 二分查找插入位置
  22. while (left < right) {
  23. int mid = (left + right) / 2;
  24. if (top[mid] >= poker)
  25. right = mid;
  26. else
  27. left = mid + 1;
  28. }
  29. if (left == piles) piles++;
  30. // 把这张牌放到牌堆顶
  31. top[left] = poker;
  32. }
  33. // 牌堆数就是 LIS 长度
  34. return piles;
  35. }