-
https://leetcode.cn/problems/minimum-segundos-to-equalize-a-circular-array
-
Se le proporciona una matriz de números de longitud n cuyos subíndices comienzan desde 0.
-
Cada segundo, puedes realizar las siguientes operaciones en la matriz:
-
Para cada subíndice i en el rango [0, n - 1], reemplace nums[i] con nums[i], nums[(i - 1 + n) % n] o nums[(i + 1) %n] Uno de los tres.
Tenga en cuenta que todos los elementos se reemplazan al mismo tiempo. -
Devuelva la cantidad mínima de segundos necesarios para cambiar todos los elementos de la matriz nums a elementos iguales.
示例 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
respuesta
- El resultado final unificado debe ser el número en la matriz. Suponiendo que los subíndices de dos valores idénticos son i y j respectivamente, el tiempo que lleva es:
máx ⌊ j − i 2 ⌋ máx \left\lfloor\dfrac{ji}{2}\right\rfloormáximo _⌊2j−yo⌋
- Tome el valor mínimo de todo el tiempo, que es la respuesta.
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;
}
};
- Solución 2
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;
}
};