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

  • https://leetcode.cn/problems/minimum-seconds-to-equalize-a-circular-array

  • 给你一个下标从 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
通过次数2,018提交次数6,5

题解

  • 最终变成的统一结果一定是数组中的数,假设两个相同数值的下标分别为 i 和 j,那么耗时为:

m a x ⌊ j − i 2 ⌋ max \left\lfloor\dfrac{j-i}{2}\right\rfloor max2ji

  • 取所有耗时的最小值,即为答案。

class Solution {
    
    
public:
    int minimumSeconds(vector<int>& nums) {
    
    
        // 用hash表存储,每个数在数组中出现的位置
        int n = nums.size();
        unordered_map<int, vector<int>> umap;
        for (int i = 0; i < n; i++) {
    
    
            umap[nums[i]].push_back(i);
        }
        int ans = n;
        // 枚举每个数使数组所有元素相等的最少秒数
        for (auto &iter : umap) {
    
    
            auto &v = iter.second;
            v.push_back(v[0] + n);// 处理循环数组
            int mx = - 1;
            for (int i = 1; i < v.size(); i++) {
    
    
                mx = max(mx, (v[i] - v[i - 1]) / 2);
            }
            ans = min(ans, mx);
        }
        return ans;
    }
};

  • 题解二

class Solution {
    
    
public:
    int minimumSeconds(vector<int>& nums) {
    
    
        // 用hash表存储,每个数在数组中出现的位置
        int n = nums.size();
        for(int i=0;i<n;i++){
    
    // 处理循环数组的另一种方法,append一个重复的数组
            nums.push_back(nums[i]);
        }
        unordered_map<int, vector<int>> umap;
        for (int i = 0; i < n*2; i++) {
    
    
            umap[nums[i]].push_back(i);
        }
        int ans = n;
        // 枚举每个数使数组所有元素相等的最少秒数
        for (auto &iter : umap) {
    
    
            auto &v = iter.second;
            // v.push_back(v[0] + n);// 处理循环数组
            int mx = - 1;
            for (int i = 1; i < v.size(); i++) {
    
    
                mx = max(mx, (v[i] - v[i - 1]) / 2);
            }
            ans = min(ans, mx);
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/ResumeProject/article/details/132165479