849. 到最近的人的最大距离『简单』
题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
说明:
1 <= seats.length <= 20000
seats
中只含有 0 和 1,至少有一个0
,且至少有一个1
。
二、解题思路
-
通过计算 seats 数组中连续 0 的个数来得到结果
-
计算连续 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);
}