问题背景
给你一个整数数组 numsnumsnums,你需要确保数组中的元素 互不相同 。为此,你可以执行以下操作任意次:
- 从数组的开头移除 333 个元素。如果数组中元素少于 333 个,则移除所有剩余元素。
注意:空数组也视作为数组元素互不相同。返回使数组元素互不相同所需的 最少操作次数 。
数据约束
- 1≤nums.length≤1001 \le nums.length \le 1001≤nums.length≤100
- 1≤nums[i]≤1001 \le nums[i] \le 1001≤nums[i]≤100
解题过程
要求去掉前缀的次数最少,相当于要求最长后缀。
得到最长后缀的长度之后,可以方便地计算出需要的次数,将向上取整转化为向下取整即可。
具体实现
class Solution {
public int minimumOperations(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int i = nums.length - 1; i >=0 ; i--) {
if (!set.add(nums[i])) {
return i / 3 + 1;
}
}
return 0;
}
}