zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    并查集基础练习
    HDU1232——畅通工程
    二分答案——划分数列
    二分答案——收入计划
    动态规划练习题(2)
    动态规划程序设计2
    动态规划练习题(1)
    0/1背包
    P5024 保卫王国[倍增+dp]
    UVA11424 GCD
  • 原文地址:https://www.cnblogs.com/zhiyin1209/p/12976801.html
Copyright © 2011-2022 走看看