一、题目概述
二、思路方向
为了原地删除重复出现的元素,并保持元素的相对顺序一致,我们可以使用双指针的方法来解决这个问题。这种方法通常被称为“快慢指针”法。在这个问题中,快指针(fast)用于遍历数组,慢指针(slow)用于指向当前不重复序列的最后一个元素。
三、代码实现
public class Solution {
public int removeDuplicates(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int slow = 0; // 慢指针
for (int fast = 1; fast < nums.length; fast++) {
// 如果当前快指针指向的元素与慢指针指向的元素不同,说明是新的不重复元素
if (nums[fast] != nums[slow]) {
slow++; // 慢指针向前移动
nums[slow] = nums[fast]; // 将新元素放到慢指针的位置
}
// 如果相同,则快指针继续向前,慢指针不动,以此达到删除重复元素的效果
}
// 由于慢指针最后会停留在最后一个不重复元素的后面,所以数组的新长度就是慢指针的索引+1
return slow + 1;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1, 1, 2, 2, 3};
int newLength = solution.removeDuplicates(nums);
System.out.println("New length: " + newLength);
// 输出前newLength个元素,验证结果
for (int i = 0; i < newLength; i++) {
System.out.print(nums[i] + " ");
}
}
}
执行结果:
四、小结
这段代码首先检查输入数组是否为空或长度为0,然后初始化慢指针
slow
为0。快指针fast
从1开始遍历数组。如果nums[fast]
不等于nums[slow]
,说明找到了一个新的不重复元素,此时将慢指针向前移动一位,并将新元素放到慢指针的位置上。如果两个指针指向的元素相同,则只移动快指针,慢指针保持不变,以此实现重复元素的“删除”(实际上是通过覆盖来忽略它们)。最后,返回慢指针加1作为数组的新长度,因为慢指针最后会停留在最后一个不重复元素的后面。在
main
函数中,我们通过一个示例数组来测试这个方法,并打印出修改后的数组长度以及前newLength
个元素,以验证结果。
结语
不要因一场薄雾
便认定前面没有什么景物
!!!