2023-08-22 LeetCode每日一题(到最近的人的最大距离)

2023-08-22每日一题

一、题目编号

复制代码
849. 到最近的人的最大距离

二、题目链接

点击跳转到题目位置

三、题目描述

给你一个数组 seats 表示一排座位,其中 seats[i] = 1 代表有人坐在第 i 个座位上,seats[i] = 0 代表座位 i 上是空的(下标从 0 开始)。

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

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

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

示例 1:
示例2:

示例3:

提示:

  • 2 <= seats.length <= 2 * 104
  • seats[i] 为 0 或 1
  • 至少有一个 空座位
  • 至少有一个 座位上有人

四、解题代码

cpp 复制代码
class Solution {
public:
    int maxDistToClosest(vector<int>& seats) {
        int dp1[20010];
        int dp2[20010];
        int max0 = 0;
        int n = seats.size();
        memset(dp1, 0, sizeof(dp1));
        memset(dp2, 0, sizeof(dp2));
        for(int i = 0; i < n; ++i){
            if(i == 0){
                if(seats[i]){
                    dp1[i] = 1;
                } else{
                    dp1[i] = 0;
                }
                continue;
            }
            if(seats[i]){
                dp1[i] = i + 1;
            } else{
                dp1[i] = dp1[i - 1];
            }
        }
        for(int i = n - 1; i >= 0; --i){
            if(seats[i]){
                dp2[i] = i + 1;
            } else{
                dp2[i] = dp2[i + 1];
            }
        }
        int len = 0;
        for(int i = 0; i < n; ++i){
            if(dp1[i] == i + 1 || dp2[i] == i + 1){
                continue;
            } else{
                int left = 0;
                int right = 0;
                if(dp1[i] == 0){
                    len = max(len, max(i + 1, dp2[i] - 1 - i));
                    continue;
                } else{
                    left = i + 1 - dp1[i];
                }
                if(dp2[i] == 0){
                    len = max(len, max(n - 1 - i, i + 1 - dp1[i]));
                    continue;
                } else{
                    right = dp2[i] - 1 - i;
                }
                len = max(len, min(left, right)); 
            }
        }
    return len;
    }
};

五、解题思路

(1) 可以用前后缀和来帮忙辅助判断,当前位置前面的最近的人的位置,当前位置后面最近的人的位置,处于方便考虑位置0的可能,所以位置一律+1.

(2) 如果前面的位置没人,所以左端的距离为i,如果后面的位置没人,所以右端的位置为i+1。

(3) 如果左右都有人,则左右端计算即可,难度不高。

相关推荐
万能程序员-传康Kk1 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球1 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788111 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~1 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子1 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
Akiiiira1 小时前
【数据结构】栈
数据结构
阳洞洞1 小时前
leetcode 18. 四数之和
leetcode·双指针
程序媛小盐2 小时前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle2 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
c6lala2 小时前
数据结构day1
数据结构