题目:删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
思路:
1.数组完成排序后,设置两个指针 i 和 j,其中 j 是慢指针(记录新数组),而 i 是快指针(遍历原先数组)。
2.只要 nums[i] = nums[j],我们就增加 i 以跳过重复项,继续遍历。
3.当 nums[i] ≠ nums[j],并将 nums[i] 赋予 nums[j + 1]。
新数组长度 + 1,并且将旧数组的非重复元素赋予新数组。
4.再次重复相同的过程,直到 j 到达数组的末尾为止。
注意点:
1.数组为空判断。
2.遍历时快指针从旧数组下标 1 开始。
3.记录的返回值 i (即新数组的长度)需要 +1,因为新数组的记录从 0 开始,并未记录。
代码:
public class demo27 {
public static void main(String[] args) {
int[] nums = {1,2,2,3,3};
int len = new Solution27().removeElement(nums);
System.out.println(len);
}
}
class Solution27 {
public int removeElement(int[] nums) {
int j = 0;
// 判断临界条件,数组为空状态
if (nums.length == 0) {
return 0;
}
for (int i = 1; i < nums.length; i++) { // 第 0 位和第 1 位进行比较,故 i 为 1
if (nums[j] != nums[i]) {
j++;
nums[j] = nums[i];
}
}
return j + 1; // 起始位置第 0 位需要加上
}
}