题目内容
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
题目解读
也就是在原来数组中进行数组元素的修改,最后数组长度与输入数组相同,但是需要返回数组等于val的元素全部移除后数组长度。
解题想法
- 刚刚开始我在想使用哈希表,将val先放入哈希表中然后将哈希表去重后,不等于val的直接放入数组中,这种方法是可行的,不过注意我们需要对原数组进行赋值,并且这里所需的额外空间虽然是O(1),但是需要不断地进行验证进行,这里需要进行contains方法。使用哈希表代码如下
public int removeElement(int[] nums, int val) {
int flag = 0;
HashSet<Integer> set = new HashSet<>();
set.add(val);
for (int i = 0; i < nums.length; i++) {
if (!set.contains(nums[i])){
nums[flag++] = nums[i];
}
}
return flag;
}
这里时间复杂度是O(n),空间复杂度是O(1),因为我们这里哈希表数据只有一个,并且使用flag常量进行标记。
2 . 然后我一想既然只用了一个常量,那么这个哈希表是否可以进行省略,就一个常量进行记录遍历到的位置,另外的一个常量是变换后数组的下标。也就是使用双指针解决方法。
public int removeElement(int[] nums, int val) {
int flag = 0;
for (int i = 0; i < nums.length; i++) {
if (val != nums[i]){
nums[flag++] = nums[i];
}
}
return flag;
}