区间交集问题

差分: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]]));

 

posted on 2023-03-12 15:29  cltt  阅读(11)  评论(0编辑  收藏  举报

导航