849. 到最近的人的最大距离『简单』

题目来源于力扣(LeetCode

一、题目

849. 到最近的人的最大距离

题目相关标签:数组

说明:

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

二、解题思路

  1. 通过计算 seats 数组中连续 0 的个数来得到结果

  2. 计算连续 0 的个数时需要考虑到 3 种情况

    • 连续 0 出现在数组开头时(即数组首位为 0)

      计算方式:0 的个数即是最大距离

    • 连续 0 出现在非数组开头和非数组结尾

      计算方式:(连续 0 的个数 - 1) / 2 + 1

    • 连续 0 出现在数组结尾时(即数组末位为 0)

      计算方式:0 的个数即是最大距离

三、代码实现

public static int maxDistToClosest(int[] seats) {
    // 初始为 1,数组首位为 0 时,可以坐在首位的情况
    int maxCount = 0;
    // 记录最大距离
    int ans = 0;

    for (int i = 0; i < seats.length; i++) {
        if (seats[i] == 0) {
            maxCount++;
        } else {
            // 当前遍历数字为 1 时,通过前面一次连续出现数字 0 的个数计算出最大距离
            if (maxCount == i) {
                // 说明此时处理的是数组从头开始的连续数字 0
                // 处理数组起始的连续零,多少个连续零即最大的距离是几
                ans = Math.max(ans, maxCount);
            } else {
                // 处理数组中间的连续零:连续 3 个为 2,连续 4 个为 2,连续 5 个为 3,连续 6 个为 3
                ans = Math.max(ans, (maxCount - 1) / 2 + 1);
            }
            // 重置数字 0 的个数为 0
            maxCount = 0;
        }
    }
    if (maxCount > 0) {
        // 处理数组末尾的连续零,多少个连续零即最大的距离是几
        ans = Math.max(ans, maxCount);
    }
    return ans;
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    int[] seats = {1, 0, 0, 0, 1, 0, 1};  // output:2
//    int[] seats = {1, 0, 0, 0};  // output:3
    int result = maxDistToClosest(seats);
    System.out.println(result);
}
posted @ 2020-05-27 21:41  知音12138  阅读(144)  评论(0编辑  收藏  举报