【今日头条笔试题】找一组坐标点的右边界点

题目描述:
给定一组坐标点集合,当其中的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}]);*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值