26. 删除有序数组中的重复项
思路1(HashMap):
创建HashMap,并将数组元素逐个放进map中,key存储新下标(从0开始),value存储数组值。若value之前没有出现过,则放进map的同时以新下标的索引放进数组中,最后返回新下表即可
但此方法不满足题目要求 不要使用额外的空间,你必须在 原地修改输入数组
代码实现
class Solution {
public int removeDuplicates(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (map.containsValue(nums[i])) {
continue;
} else {
map.put(j, nums[i]);
nums[j] = map.get(j);
j++;
}
}
return j;
}
}
思路2(快慢指针):
- 数组长度为0时,return 0;
- 设置 slow = 1, fast = 1。nums[fast] 与 nums[fast - 1]作比较,如果相等则fast继续往下走,找不相等的;如果不相等,则将 nums[fast]的值赋给 nums[slow],此时 slow 和 fast 都往下走一步。
- 最后slow的值就是 不重复元素的个数
代码实现
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
if (n == 0) return 0;
int slow = 1;
int fast = 1;
while (fast < n) {
if (nums[fast] == nums[fast - 1]) {
} else {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
思路3:
- 创建新变量 t = 0
- 遍历数组nums,并将 当前元素与前一个元素 进行比较,如果不相等,即 将当前元素 赋给 nums[t++];如果相等继续遍历即可
- 注意:下标为0 的时候单独分析
代码实现
class Solution {
public int removeDuplicates(int[] nums) {
int t = 0;
for (int i = 0; i < nums.length; i++) {
if (i == 0 || nums[i] != nums[i - 1]) nums[t++] = nums[i];
}
return t;
}
}