第一种:快慢双指针
整体思想就是定义两个指针slow和fast,初始值都是0。
slow之前的位置都是有效部分,fast表示当前要访问的元素。
这样遍历的时候,fast不断向后移动:
- 如果nums[fast]的值不为val,则将其移动到nums[slow++]处。
- 如果nums[fast]的值为val,则fast继续向前移动,slow先等待。
public int removeElement(int[] nums, int val) {
int fast = 0, slow = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == val) {
fast++;
} else {
nums[slow] = nums[fast];
slow++;
fast++;
}
}
return slow;
}
26. 删除有序数组中的重复项 - 力扣(LeetCode)
public int removeDuplicates(int[] nums) {
int fast = 0, slow = 0;
for (int i = 0; i < nums.length - 1; i++) {
++fast;
if (nums[fast] == nums[slow]) {
continue;
}
slow++;
nums[slow] = nums[fast];
}
return slow + 1;
}