标记量
思路
相等时,在while中增加数组下标值,直到碰见不等数值(注意边界判断,放在&&前)。
根据标记量确定覆盖位置的下标。
时间复杂度:O(n)。
空间复杂度:O(1)。
class Solution {
public int removeElement(int[] nums, int val) {
int j=0;
for(int i=0;i<nums.length;i++){
while(i<nums.length&&nums[i]==val){//相等时;注意边界i<的判断在前
j++;
i++;
}
if(i<nums.length)
nums[i-j]=nums[i];//碰到了不等
}
return nums.length-j;
}
}
参考官答:
快慢指针
思路1
当nums[j]与给定的值相等时,递增 j 以跳过该元素。
nums[j]!=val,复制 nums[j] 到 nums[i]并同时递增两个索引。
重复这一过程,直到 j到达数组的末尾,该数组的新长度为 i。
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;
}
思路2(不考虑数组顺序的情况)
为减少数组移动带来的资源浪费,在不考虑保证数组顺序的情况下,当nums[i]==val时将该值与最后一个未检查的值交换,并重新检查i下标的值。
时间复杂度:O(n)。
空间复杂度:O(1)。
public int removeElement(int[] nums, int val) {
int i = 0;
int n = nums.length;
while (i < n) {
if (nums[i] == val) {
nums[i] = nums[n - 1];
// reduce array size by one
n--;
} else {
i++;
}
}
return n;
}