给你一个下标从 0 开始的数组 nums ,该数组由 n 个正整数组成。
如果满足下述条件,则数组 nums 是一个 交替数组 :
nums[i - 2] == nums[i] ,其中 2 <= i <= n - 1 。
nums[i - 1] != nums[i] ,其中 1 <= i <= n - 1 。
在一步 操作 中,你可以选择下标 i 并将 nums[i] 更改 为 任一 正整数。
返回使数组变成交替数组的 最少操作数 。
示例 1:
输入:nums = [3,1,3,2,4,3]
输出:3
解释:
使数组变成交替数组的方法之一是将该数组转换为 [3,1,3,1,3,1] 。
在这种情况下,操作数为 3 。
可以证明,操作数少于 3 的情况下,无法使数组变成交替数组。
示例 2:
输入:nums = [1,2,2,2,2]
输出:2
解释:
使数组变成交替数组的方法之一是将该数组转换为 [1,2,1,2,1].
在这种情况下,操作数为 2 。
注意,数组不能转换成 [2,2,2,2,2] 。因为在这种情况下,nums[0] == nums[1],不满足交替数组的条件。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 105
class Solution {//找到奇偶下标对应的最高频率和次高频率,剩下的用他们替换public int minimumOperations(int[] nums) {int n = nums.length;if (n == 1) return 0;Map<Integer,Integer> map1 = new HashMap(), map2 = new HashMap();for (int i = 0; i < n; ++i)if (i % 2 == 0) map1.put(nums[i],map1.getOrDefault(nums[i],0) + 1);else map2.put(nums[i],map2.getOrDefault(nums[i],0) + 1);int aa = 0, bb = 0, a1 = 0, a2 = 0, b1 = 0, b2 = 0;//分别找奇偶下标的最多和次多数for (Map.Entry<Integer,Integer> entry : map1.entrySet()) {if (entry.getValue() > a1) {aa = entry.getKey();a2 = a1;a1 = entry.getValue();} else if (entry.getValue() > a2)a2 = entry.getValue();}for (Map.Entry<Integer,Integer> entry : map2.entrySet()) {if (entry.getValue() > b1) {bb = entry.getKey();b2 = b1;b1 = entry.getValue();} else if (entry.getValue() > b2)b2 = entry.getValue();}//如果不等就直接返回if (aa != bb) return n - a1 - b1;//相等就取保留的最大值else return n - Math.max(a1 + b2, b1 + a2);}}
