leetcode 218. The Skyline Problem 使用PriorityQueue的java实现 以及细致分析

题目解析:要得到大致轮廓,我们首先可以将X轴排序,高度为正插入,高度为负,删除对应高度。每次取得一个高度应该是所有高度中最高的,想到使用PriorityQueue。每次插入或删除,需要比较当前高度与之前最高值的大小,不一样就更新结果集。

public List<int[]> getSkyline(int[][] bs) {
            List<int[]> res=new ArrayList<int[]>();
	        List<int[]> b1=new ArrayList<int[]>();
			 if(bs.length<1) return res;
			/**存储x,y的值,如果是开始位置,高度为正,结束位置,高度为负*/
	        for(int i=0;i<bs.length;i++)
	        {
	        	b1.add(new int[]{bs[i][0],bs[i][2]});
	        	b1.add(new int[]{bs[i][1],-bs[i][2]});
	        }
	        /**按照X轴的顺序进行排列*/
	        Collections.sort(b1,new Comparator<int[]>()
	        {

				@Override
				public int compare(int[] a1, int[] a2) {
					/**X不相等,直接比较*/
					if(a1[0]!=a2[0]) return a1[0]-a2[0];
					/**X相等,大的放在前面,省的放到优先级队列还要再次排序*/
					return a2[1]-a1[1];
				}
	        	
	        });
	        /**优先级队列,保证返回的是当前有效的最高值*/
	        PriorityQueue<Integer>  pq=new PriorityQueue<Integer>(11,new Comparator<Integer>()
	        		{

						@Override
						public int compare(Integer o1, Integer o2) {
							
							return o2-o1;
						}
	        	
	        		});
	        int cur=0;
	        int pre=0;
	        
	        for(int i=0;i<b1.size();i++)
	        {
	        	int[] b=b1.get(i);
	        	/**开始位置*/
	        	if(b[1]>=0)
	        	{
	        		pq.add(b[1]);
	        		cur=pq.peek();
	        	}
	        	/**结束位置*/
	        	else
	        	{
	        		pq.remove(-b[1]);
	        		cur=pq.peek()==null?0:pq.peek();
	        	}
	        	if(cur!=pre)
	        	{
	        		res.add(new int[]{b[0],cur});
	        		pre=cur;
	        	}
	        }
	        return res;
	    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值