方法一. 同向双指针(快慢指针)
思路:
初始化快慢指针为 0,如果 fast 指针的位置不为 val
则赋值 nums[slow] = nums[fast]
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0, slow = 0;
for (; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
}
时间: O(n)
n 为数组长度
空间: O(1)
方法二. 相向双指针
思路:
初始化左右指针
先把右指针移到 非val
的位置
循环:
如果 nums[l] == val
则 nums[l] = nums[r--]
循环内部每次也要将 右指针 移至 非 val
的位置
class Solution {
public int removeElement(int[] nums, int val) {
int l = 0, r = nums.length - 1;
while (r >= 0 && nums[r] == val) r--;
while (l <= r) {
if (nums[l] == val) {
nums[l] = nums[r--];
}
l++;
while (r >= 0 && nums[r] == val) r--;
}
return l;
}
}