区间交集问题
差分:https://blog.csdn.net/weixin_54442315/article/details/122663584
arr 1 4 7 12
map 1 3 3 5
map为差分数组,当arr区间更新时,可以仅更新map的区间端点
借助Map 得到arr的元素|前n项和
问题:https://www.acwing.com/problem/content/1954/
function get(ar,x,y,z){ let n =ar.length; let map =new Map(); // 差分数组 for(let i =0;i<n;i++){ // map[0]+=x; map.set(0,map.get(0)==undefined?x:map.get(0)+x); // map[ar[i][0]]+=(-x+y); map.set(ar[i][0],map.get(ar[i][0])==undefined?(-x+y):map.get(ar[i][0])+(-x+y)); // map[ar[i][1]]+=(-y+z); map.set(ar[i][1]+1,map.get(ar[i][1]+1)==undefined?(-y+z):map.get(ar[i][1]+1)+(-y+z)); } // 需要借助前缀和计算每个温度对应的结果,所以需要map的key从小到大排序 // 但是js中map的key 不会自动排序 (排序) c++可以的 let arp =[...map]; arp.sort((o1,o2)=>{ return o1[0]-o2[0]; }); map = new Map(arp); let sum =0,maxx =0; for(let key of map.keys()){ sum+=map.get(key); maxx = Math.max(sum,maxx); } return maxx; } let ar =[[5,8],[3,4],[13,20],[7,10]]; console.log(get(ar,7,9,6));
n个区间,代表不同烟花的开始和结束时刻
在某个时刻可以最多看到几个烟花,这种时刻有几个??
[2,6]
[3,7]
[9,10]
在时刻 3 可以看到2个烟花
这样的时刻有 3 4 5 6 ,共4个
function get(ar){ let n =ar.length; let map =new Map(); for(let i =0;i<n;i++){ map.set(ar[i][0],map.get(ar[i][0])==undefined?1:map.get(ar[i][0])+1); map.set(ar[i][1]+1,map.get(ar[i][1]+1)==undefined?-1:map.get(ar[i][1]+1)-1); } let arp = [...map]; arp.sort((o1,o2)=>{ return o1[0]-o2[0]; }) map = new Map(arp); let cnt =0; let maxx =0; let ars =[]; for(let key of map.keys()){ cnt+=map.get(key); ars.push([key,cnt]) maxx =Math.max(cnt,maxx); } let sum =0; for(let i=0;i<ars.length;i++){ if(ars[i][1]===maxx){ sum+=(ars[i+1][0]-ars[i][0]); } } return maxx+" "+sum; } console.log(get([[2,6],[3,7],[9,10]]));