双指针:两个指针分别指向首尾,遍历头指针,遇到等于val时,遍历尾指针,找到不等于val的值,进行交换,
两指针相撞时,结束。
public int removeElement(int[] nums, int val)
{
int i = 0, j = nums.length-1;
// 将等于val的数移动到数组右边
while (i <= j)
{
if (nums[i] != val)
{
i++;
}
else
{
// 找到第一个不等于val的数
while (i <= j && nums[j] == val){
j--;
}
if(i < j){
swap(nums, i, j);
i++;
j--;
}
}
}
return i;
}
void swap(int[] nums, int i, int k)
{
int tmp = nums[i];
nums[i] = nums[k];
nums[k] = tmp;
}
快慢指针: 当 nums[j]nums[j] 与给定的值相等时,递增 jj 以跳过该元素。只要 nums[j] \neq valnums[j]̸=val,
我们就复制 nums[j]nums[j] 到 nums[i]nums[i] 并同时递增两个索引。重复这一过程,直到 jj 到达数组的末尾,
该数组的新长度为 ii。
public int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}