跟LintCode的算法题杠上了(1451到最近的人的最大距离)

题目

在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。

至少有一个空座位,且至少有一人坐在座位上。

亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。

返回他到离他最近的人的最大距离。

1 <= seats.length <= 20000
seats 中只含有 0 和 1,至少有一个 0,且至少有一个 1。

样例 1:

输入:[1,0,0,0,1,0,1]
输出:2
解释:
如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2 。
如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1 。
因此,他到离他最近的人的最大距离是 2 。

输入:[1,0,0,0]
输出:3
解释:
如果亚历克斯坐在最后一个座位上,他离最近的人有 3 个座位远。
这是可能的最大距离,所以答案是 3 。

思路

  • 要考虑只有1个座位的情况,单独处理
  • 2个座位之间相减 的绝对值,除以2,然后向下取整,然后一次比较这个数的大小
  • 要考虑座位不在头,或者不在尾的情况

public static void main(String[] args) {
    //int [] a = {0,1,0,0,0,1,0,0,0,0};
    int [] a = {0,0,0,0,0,1,0,0,0,0,0,0,0};
    int b = maxDistToClosest(a);
    System.out.println(b);
}


public static int maxDistToClosest(int[] seats) {
    int seat = 0;
    //把座位的下标记录下来
    List<Integer> index = new ArrayList<>();
    for(int i = 0; i < seats.length; i ++){
        if(seats[i] == 1){
            index.add(i);
        }
    }

    if(index.size() == 1){

        //如果只有一个座位,那么就肯定是头或者尾巴才能保证最远距离
        int tou = index.get(0) - 0;
        int wei = seats.length - 1 - index.get(0);
        if(wei > tou){
            seat = wei;
        }else{
            seat = tou;
        }
    }else{
        int max = 0;

		//如果有多个座位的情况
        //找到座位里面下标距离最大的数,计算方式是相邻的2个数字取绝对值然后除以2 向下取整数
        for(int k = 0; k < (index.size() - 1); k ++){
            int seatIndex = (int)Math.floor(Math.abs(index.get(k) - index.get(k + 1)) / 2);
            if(seatIndex > max){
                max = seatIndex;
            }
        }

        //然后就要考虑第一个座位是不是在第0个位置,例如00001这种情况
        if(index.get(0) != 0){
            int seatIndex = index.get(0) - 0;
            if(seatIndex > max){
                max = seatIndex;
            }
        }

        //最后一个座位的下标是不是在最后一个位置,例如10000这样的
        if(index.get(index.size() - 1) < seats.length){
            int seatIndex = seats.length - 1 - index.get(index.size() - 1);
            if(seatIndex > max){
                max = seatIndex;
            }
        }
        seat = max;
    }
    return seat;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珍妮玛•黛金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值