【数组】【最长距离】使循环数组所有元素相等的最少秒数

简介: 【数组】【最长距离】使循环数组所有元素相等的最少秒数

本文涉及知识点

数组 最长距离

LeetCode2808. 使循环数组所有元素相等的最少秒数

给你一个下标从 0 开始长度为 n 的数组 nums 。

每一秒,你可以对数组执行以下操作:

对于范围在 [0, n - 1] 内的每一个下标 i ,将 nums[i] 替换成 nums[i] ,nums[(i - 1 + n) % n] 或者 nums[(i + 1) % n] 三者之一。

注意,所有元素会被同时替换。

请你返回将数组 nums 中所有元素变成相等元素所需要的 最少 秒数。

示例 1:

输入:nums = [1,2,1,2]

输出:1

解释:我们可以在 1 秒内将数组变成相等元素:

  • 第 1 秒,将每个位置的元素分别变为 [nums[3],nums[1],nums[3],nums[3]] 。变化后,nums = [2,2,2,2] 。
    1 秒是将数组变成相等元素所需要的最少秒数。
    示例 2:

输入:nums = [2,1,3,3,2]

输出:2

解释:我们可以在 2 秒内将数组变成相等元素:

  • 第 1 秒,将每个位置的元素分别变为 [nums[0],nums[2],nums[2],nums[2],nums[3]] 。变化后,nums = [2,3,3,3,3] 。
  • 第 2 秒,将每个位置的元素分别变为 [nums[1],nums[1],nums[2],nums[3],nums[4]] 。变化后,nums = [3,3,3,3,3] 。
    2 秒是将数组变成相等元素所需要的最少秒数。
    示例 3:

输入:nums = [5,5,5,5]

输出:0

解释:不需要执行任何操作,因为一开始数组中的元素已经全部相等。

提示:

1 <= n == nums.length <= 105

1 <= nums[i] <= 109

枚举

本题   ⟺    \iff 一个病毒可以向左右各传播一位,最快多短时间传播到整个数组。

mIndexs 的key是值,value是此值所有的下标升序。

枚举各值传播到整个数组的时间。

v[i]到v[i+1]之间的数,显然最中间的数,最难传染。假定中间的数数量是x,需要传播的时间为:

image.png

可以统一为 (x+1)/2。

v[0]之前,v.back()之后的也要统一处理。其实v[1].size()等于0,也无需特殊处理。

代码

核心代码

class Solution {
  public:
    int minimumSeconds(vector<int>& nums) {
      const int n = nums.size();
      unordered_map<int, vector<int>> mIndexs;
      for (int i = 0; i < n ; i++)
      {
        mIndexs[nums[i]].emplace_back(i);
      }
      int iRet = (nums.size()-1+1)/2;
      for (const auto& [tmp, v] : mIndexs)
      {
        if (1 == v.size()) {
          continue;
        }
        int iMaxCnt = n - 1 - v.back() + v.front();
        for (int i = 1; i < v.size(); i++)
        {
          iMaxCnt = max(iMaxCnt, v[i] - v[i - 1] - 1);
        }
        iRet = min(iRet, (iMaxCnt + 1) / 2);
      }
      return iRet;
    }
  };

测试用例

vector<int> nums = { 2, 1, 3, 3, 2 };
  {
    Solution sln;
    nums = { 2, 1, 3, 3, 2 };
    auto res = sln.minimumSeconds(nums);
    Assert(res, 2);
  }
  {
    Solution sln;
    nums = { 1,2,3 };
    auto res = sln.minimumSeconds(nums);
    Assert(res, 1);
  }


扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关文章
|
5月前
|
存储 算法 计算机视觉
数组
数组
43 0
|
4月前
数组(3)
数组(3)
28 2
|
4月前
|
存储 开发框架 .NET
C#中的数组探索
C#中的数组探索
|
12月前
|
存储 C语言 索引
C 数组
C 数组。
36 0
|
5月前
1-9 数组
1-9 数组
21 0
|
5月前
|
存储 人工智能 算法
4.为何数组下表从0开始
4.为何数组下表从0开始
60 1
|
5月前
|
存储 程序员 C++
|
算法
三 数组
三 数组
52 0
|
存储 编译器 程序员
|
Serverless
数组练习
数组练习