- HashMap 存储
类似题目 2 移除元素的思路,用 HashMap 存储元素及出现次数,大于等于 3 时就更新数组
代码如下:
public static int removeDuplicates(int[] nums) {
int ans = nums.length;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < ans; i++) {
map.put(nums[i], map.get(nums[i]) == null ? 1 : map.get(nums[i]) + 1);
if (map.get(nums[i]) >= 3) {
ans--;
for (int j = i; j < ans; j++) {
nums[j] = nums[j + 1];
}
i--;
}
}
return ans;
}
- 双指针
设置快慢双指针,快指针用于遍历,表示下一个要检查的元素的下标,慢指针表示要保留的最新元素的下标
代码如下:
public static int removeDuplicates(int[] nums) {
int n = nums.length;
//slow:确定要保留的最后一个元素位置
//fast:遍历,接下来要检查的第一个元素位置
int slow = 2, fast = 2;
while (fast < n) {
if (nums[slow - 2] != nums[fast]) {
//保留元素
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
- 数组有序 & 保留逻辑(宫水三叶解法)
利用数组有序和保留逻辑两大主要性质,直接保留前 2 个数字,后面的元素,与最后一种保留元素的第一个数比较,不同则保留
代码如下:
public static int removeDuplicates(int[] nums) {
//index: 保留数组的下标
int index = 0;
for (int x : nums) {
if (index < 2 || nums[index - 2] != x) {
nums[index++] = x;
}
}
return index;
}