【Leetcode】2808. 使循环数组所有元素相等的最少秒数

文章目录

  • 题目
  • 思路
  • 代码
  • 结果

题目

题目链接
给你一个下标从 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

思路

对于每个可能的 x - 数组的最终值,计算使所有元素等于 x 所需的秒数。如果连续出现两次 (i,j) x 次,则使段 [i + 1, j - 1] 等于 x 的操作数为 floor((j - i) / 2)

代码

class Solution {
public:
    int minimumSeconds(vector& nums) {
        int n = nums.size();
        // 破环成链
        for(int i = 0; i < n; i ++) nums.push_back(nums[i]);
        n *= 2;
        unordered_map> h;
        for(int i = 0; i < n; i ++) h[nums[i]].push_back(i);
        int res = INT_MAX;
        for(auto &[k, v] : h)
        {
            int m = v.size();
            int cnt = 0;
            for(int i = 1; i < m; i ++)
            {
                cnt = max(cnt, (v[i] - v[i - 1]) / 2);
            }
            res = min(res, cnt);
        }
        return res;
    }
};

结果

【Leetcode】2808. 使循环数组所有元素相等的最少秒数_第1张图片

你可能感兴趣的:(练习题(记录做题想法),leetcode,算法,职场和发展)