优化技巧:
题目:
1.前缀和
2.区间合并

function merge(list){ list.sort((a,b)=>a[0]-b[0])//先按照每个区间的start位置排序 let res = [] res.push(list[0]) for(let i=1;i<list.length;i++){ let cur = list[i] let last = res[res.length-1] if(cur[0]<last[1]){ last[1] = Math.max(last[1],cur[1]) }else{ res.push(cur); } } return res;}
3.区间交集

function intervalSection(a,b){ let i=0,j=0,res=[]; while(i<a.length&&j<b.length){ const ai = a[i],bj=b[j]; if(b2>=a1&&a2>=b1){//存在交集的条件 //具体交集区间的计算 res.push([Math.max(ai[0],bj[0]),Math.min(ai[1],bj[1])]) //指针的前进规则 if(b2>a2){j++;}else{ i++;} } } return res;}
4.二维数组(FloodFill算法)
5.最长递增子序列(动态规划/扑克牌二分法)


function maxEnvelops(envelops){ const len = envelops.length; envelops.sort((a,b)=>{ return a[0]===b[0]?(b[1]-a[1]):(a[0]-b[0]); }); let heights = []; for(let i=0;i<len;i++){ heights[i] = envelops[i][1]; } return lengthOfLTS(heights);}// 放扑克牌方式,解释二分法/* 返回 nums 中 LIS 的长度 */public int lengthOfLIS(int[] nums) { int piles = 0, n = nums.length; int[] top = new int[n]; for (int i = 0; i < n; i++) { // 要处理的扑克牌 int poker = nums[i]; int left = 0, right = piles; // 二分查找插入位置 while (left < right) { int mid = (left + right) / 2; if (top[mid] >= poker) right = mid; else left = mid + 1; } if (left == piles) piles++; // 把这张牌放到牌堆顶 top[left] = poker; } // 牌堆数就是 LIS 长度 return piles;}