题目描述
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。
总结
SC:双指针,之前教会了逆向思维,现在又教会了我跳跃思维,数组的题不要总是盯着指针位前后的数 看着一年前的DC,感慨万千,明天开始一定要自己先做出来再看答案
Sample Code
class Solution {
public int removeElement(int[] nums
, int val
) {
int i
= 0, j
= nums
.length
- 1;
while (i
<= j
) {
if (nums
[i
] == val
) {
nums
[i
] = nums
[j
];
j
--;
} else {
i
++;
}
}
return j
+ 1;
}
}
Demo Code
class Solution {
public int removeElement(int[] nums
, int val
) {
int length
= nums
.length
;
int a
= 1;
if (nums
.length
< 1)
return nums
.length
;
if (nums
.length
== 1) {
if (val
== nums
[0]) return 0;
else return 1;
}
for (int i
= 0;i
< length
;i
++) {
if (nums
[i
] == val
) {
nums
[i
] = nums
[nums
.length
- a
++];
i
--;
length
--;
}
}
return length
;
}
}
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-element