【今日頭條筆試題】找一組座標點的右邊界點

題目描述:
給定一組座標點集合,當其中的x點使得集合p中的所有的點均不在x的右上方時(橫縱座標均大於x的點)稱爲最大點,找出點集合中所有的最大點。同時按X有小到大的順序輸出點集合
解析:
該題意就是要找邊界點,思路就是對點集合按x進行排序, 從x最大的點進行開始進行遍歷,當Y的值逐漸變大時則滿足條件,即呈階梯狀。

var P =[];
var count = parseInt(read_line());
var line ;
while (count--) {
    line = read_line();
    line=line.split(" ");
    P.push({
        x:parseInt(line[0]),
        y:parseInt(line[1])
    });
}
function findMax(P){
    var res=[];
    P.sort(function(a,b){
        return b.x - a.x;
    })
    var maxY = P[0].y;
    for(var i =0;i<P.length;i++){
        if(P[i].y>=maxY){
            res.push([P[i].x,P[i].y]);
            maxY = P[i].y;
        }
    }
    return res;
}
var result = findMax(P);

/*var result = findMax([{x:1,y:2},{x:5,y:3},{x:4,y:6},{x:7,y:5},{x:9,y:0}]);*/
/*var result = findMax([{x:1,y:2},{x:3,y:1}]);*/

for(var i =result.length -1;i>=0;i--){
    print((result[i][0]+" "+result[i][1]))
}

當然這題還有優化算法,那就是利用Y排序找X遞增的,道理一樣,只是題目要求按照X從小到達輸出,如果按Y排序找到點就可以直接輸出,不需要最後的一個循環:

var P =[];
var count = parseInt(read_line());
var line ;
while (count--) {
    line = read_line();
    line=line.split(" ");
    P.push({
        x:parseInt(line[0]),
        y:parseInt(line[1])
    });
}
function findMax(P){
    var res=[];
    P.sort(function(a,b){
        return b.y - a.y;
    })
    var maxX = P[0].x;
    for(var i =0;i<P.length;i++){
        if(P[i].x>=maxX){
           print(P[i].x+" "+P[i].y);
            maxY = P[i].y;
        }
    }

}
findMax(P);

/*var result = findMax([{x:1,y:2},{x:5,y:3},{x:4,y:6},{x:7,y:5},{x:9,y:0}]);*/
/*var result = findMax([{x:1,y:2},{x:3,y:1}]);*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章