class Solution {
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;
}
}
//双指针优化后:
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
int j = 0;
while (j < nums.length) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
j++;
}
return i;
}
}
使用两个指针i和j。i用于记录没有与给定值val相等的元素的当前位置,而j用于遍历整个数组。在每次循环中,我们检查当前元素是否等于给定值。如果不等于,则将该元素复制到i所指向的位置,并将i增加1。然后,我们增加j以继续遍历数组。最后,返回i作为结果,它表示不包含给定值val的元素的数量。
第一个代码使用了一个额外的数组空间,因为我们在原数组nums
上创建了一个新的、不包含给定值val
的数组。因此,空间复杂度为O(n)。
而第二个代码使用双指针技术,在原地修改数组,不需要使用额外的数组空间。因此,空间复杂度为O(1)。