题目地址:https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/
Follow up for “Remove Duplicates”:
What if duplicates are allowed at most twice?
For example,
Given sorted array nums = [1,1,1,2,2,3]
,
Your function should return length = 5, with the first five elements of *nums being 1, 1, 2, 2
and 3
. It doesn’t matter what you leave beyond the new length.*
题目说了,给一个有序的数组,这个数组里面的元素可能有重复的,那边现在是要除去重复的,并且保留下来重复的数字不大于2就可以了。注意题目不仅仅要求要有处理后的数组的长度,还要有处理后的数组的值。
既然有序了,那肯定是重复的数字是互相挨着的,所以从前往后扫一次数组就可以了,但是注意这里的容器是数组,也就是说移除完以后还得移动后面的元素,那这个操作就比较耗时间了,所以不到万不得已不这么干。
我们也可以用Map来映射一下数组中的元素,并且还可以计个数,超出2的就记为2,然后把Map中的元素回写到数组中就OK了,正好Java中给我们提供了TreeMap这样的容器,不仅可以用于计数,而且还可以保证顺序。
代码实现如下:
public class RemoveDuplicatesFromSortedArrayII {
public static int removeDuplicates(int[] nums) {
if (nums.length <= 2)
return nums.length;
int result = nums.length;
TreeMap<Integer, Integer> map = new TreeMap<>();
for (int num : nums) {
if (!map.containsKey(num)) {
map.put(num, 1);
} else {
if (map.get(num) >= 2)
result--;
else
map.put(num, 2);
}
}
int k = 0;
for (Map.Entry entry : map.entrySet()) {
for (int i = 0; i < (int)entry.getValue(); i++) {
nums[k++] = (int)entry.getKey();
}
}
return result;
}
public static void main(String[] args) {
int[] nums = {1, 1, 1, 2, 2, 3};
System.out.println(removeDuplicates(nums));
}
}