一、题目
1、题目描述
给你一个下标从 0 开始长度为
n
的数组nums
。每一秒,你可以对数组执行以下操作:
- 对于范围在
[0, n - 1]
内的每一个下标i
,将nums[i]
替换成nums[i]
,nums[(i - 1 + n) % n]
或者nums[(i + 1) % n]
三者之一。注意,所有元素会被同时替换。
请你返回将数组
nums
中所有元素变成相等元素所需要的 最少 秒数。
2、接口描述
class Solution {
public:
int minimumSeconds(vector<int>& nums) {
}
};
3、原题链接
二、解题报告
1、思路分析
我们知道最终状态是n个相同的数字x
那么对于初始状态到最终状态最少要操作几次呢?
我们发现每次能让每个x左右相邻数字也转化为x,这个操作是对整个数组中的x而言的
那么最多操作次数就是相邻两个x间的最大距离+1再除以二
我们哈希计数即可
2、复杂度
时间复杂度: O(N) 空间复杂度:O(N)
3、代码详解
class Solution {
public:
int minimumSeconds(vector<int>& nums) {
unordered_map<int,int> pre, cnt;
for(int i = 0, n = nums.size(); i < n; i++)
pre[nums[i]] = i - n;
for(int i = 0, n = nums.size(); i < n; i++)
cnt[nums[i]] = max(cnt[nums[i]], (i - pre[nums[i]]) / 2), pre[nums[i]] = i;
int ret = INT_MAX;
for(auto x : cnt)
ret = min(ret, x.second);
return ret == INT_MAX ? 0 : ret;
}
};