1、List集合
使用java中的List集合,遍历数组,判断集合中是否已经有该元素,如果没有,则把该元素放入集合中,最后集合中的元素放回数组,就是最终答案。
public int removeDuplicates(int[] nums) {
List<Integer> list = new ArrayList();
for(int i = 0;i < nums.length;i++){
if(!list.contains(nums[i])){
list.add(nums[i]);
}
}
for(int i = 0;i < list.size();i++){
nums[i] = list.get(i);
}
return list.size();
}
}
2、双指针法
一个指针 i 进行数组遍历,另外一个指针 j 指向有效数组的最后一个位置。
只有当 i 所指向的值和 j 不一致(不重复),才将 i 的值添加到 j 的下一位置。
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
int j = 0;
for (int i = 0; i < n; i++) {
if (nums[i] != nums[j]) {
nums[++j] = nums[i];
}
}
return j + 1;
}
}
3、通用解法
为了使得解法更加普遍,我们将保留1位换成保留k位。
- 由于是保留k个数字,所以前k位我们可以直接保留
- 对于后面的数字,判断与当前写入位置前的k位数字进行笔记比较,只要不一样,就可以保留
public int removeDuplicates(int[] nums) {
return process(nums, 1);
}
int process(int[] nums, int k) {
int idx = 0;
for (int x : nums) {
if (idx < k || nums[idx - k] != x) nums[idx++] = x;
}
return idx;
}
}