天际线问题

leetcode题目描述

import java.util.*;
public class Solution {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Solution test=new Solution();//[[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]
        //[[0,2,3],[2,5,3]]
        //[[1,2,1],[1,2,2],[1,2,3]]
        //[[0,3,3],[1,5,3],[2,4,3],[3,7,3]]
        int[][] input=new int[][]{{0,3,3},{1,5,3},{2,4,3},{3,7,3}};
        System.out.println(test.getSkyline(input));

    }
    class Point{
        int x;
        int h;
        public Point(int x,int h){
            this.x=x;
            this.h=h;
        }
    }
    public List<List<Integer>> getSkyline(int[][] buildings) {
        ArrayList<Point> lines=new ArrayList<>();
        if(buildings==null||buildings.length==0){
            return null;
        }
        int[] line=buildings[0];
        lines.add(new Point(line[0],line[2]));
        lines.add(new Point(line[1],0));
        Point p1,p2;
        for(int i=1;i< buildings.length;i++){
            line=buildings[i];
            int curLen=lines.size();
            int j=0;
            while(j<lines.size()){
                while(j<lines.size()&&lines.get(j).x<line[0]){
                    j++;
                }
                if(j<lines.size()){//当前j的点小于或等于line[0]
                    p2=lines.get(j);
                    if(line[0]<p2.x){//line的左端点小于j的x
                        p1=lines.get(j-1);
                        if(line[2]>p1.h){//line的高度大
                            lines.add(j,new Point(line[0],line[2]));
                            if(line[1]<p2.x){
                                lines.add(j+1,new Point(line[1],p1.h));
                                j=lines.size()+1;
                            }else if(line[1]>p2.x){
                                line[0]=p2.x;
                            }else{
                                j=lines.size()+1;
                            }
                        }else{//line的高度小于等于
                            if(line[1]>p2.x){
                                line[0]=p2.x;
                            }else{
                                j=lines.size()+1;
                            }
                        }
                    }else{//line的左端点等于j的x
                        int tempH=p2.h;
                        if(p2.h<line[2]){//line的高度高
                            p2.h=line[2];
                            if(j==lines.size()-1){
                                lines.add(new Point(line[1],0));
                                j=lines.size()+1;
                            }else{
                                if(line[1]<lines.get(j+1).x){
                                    lines.add(j+1,new Point(line[1],tempH));
                                    j=lines.size()+1;
                                }else if(line[1]>lines.get(j+1).x){
                                    line[0]=lines.get(j+1).x;
                                }else{
                                    j=lines.size()+1;
                                }
                            }
                        }else{//line的高度小于等于
                            if(line[1]<lines.get(j+1).x){
                                j=lines.size()+1;
                            }else if(line[1]>lines.get(j+1).x){
                                line[0]=lines.get(j+1).x;
                            }else{
                                j=lines.size()+1;
                            }
                        }
                    }

                }

            }
            if(j==lines.size()){//已到末尾
                lines.add(new Point(line[0],line[2]));
                lines.add(new Point(line[1],0));
            }
            for(int k=1;k<lines.size();k++){
                if(lines.get(k).h==lines.get(k-1).h){
                    lines.remove(k);
                    k--;
                }
            }
        }
        List<List<Integer>> ans= new ArrayList<>();
        for(int i=0;i<lines.size();i++){
            List<Integer> list=new ArrayList<>();
            list.add(lines.get(i).x);
            list.add(lines.get(i).h);
            ans.add(list);
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值