给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
时间: 2023-05-31 11:20:57 浏览: 127
### 回答1:
题目描述:
给定一个数组 nums 和一个值 val,需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。
解题思路:
使用双指针,一个指针指向当前遍历到的元素,另一个指针指向新数组的末尾。如果当前元素不等于 val,就将其放到新数组的末尾,并将新数组的长度加 1。
代码实现:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int j = ;
for (int i = ; i < n; i++) {
if (nums[i] != val) {
nums[j] = nums[i];
j++;
}
}
return j;
}
};
### 回答2:
题目要求我们从给定的数组中移除所有数值等于val的元素,并返回移除后数组的新长度。这里要特别注意的是,题目中要求的是“原地”移除,并且还要返回新的数组长度,所以不能使用额外的空间来存储数组。
一般解法会使用两个指针 i 和 j,其中 i 指向当前遍历的元素,j 指向原始数组中下一个非val值应该插入的位置。当 i 扫描到一个非val值时,将这个值赋值给 nums[j],并且将 j 向后移动一位;当 i 扫描到一个val值时,直接跳过(即不进行任何操作)。最终,j就是新数组的长度,即可返回 j。
具体实现如下:
```python
def removeElement(nums: List[int], val: int) -> int:
j = 0
for i in range(len(nums)):
if nums[i] != val:
nums[j] = nums[i]
j += 1
return j
```
对于数组中的每一个元素,都只扫描了一遍,时间复杂度是 O(n),并且由于没有使用额外空间,空间复杂度是 O(1)。
### 回答3:
题目简述:
给你一个数组nums和一个值val,要求把数组中所有值为val的元素原地移除,并返回移除后数组的新长度。
解题思路:
本题要求在原地操作,即不能新建一个数组。那么我们可以使用双指针来解决这个问题。定义一个指针i和一个指针j,初始时都指向数组的开头。
我们遍历整个数组,如果nums[i]等于val,那么我们就将nums[i]和nums[j]交换,并让j指针向后移动一位。这时,我们可以发现,指针j前面的数都是不等于val的,指针i前面的数也有可能是等于val的,所以我们需要不停的交换,直到i指针指向的数不等于val为止。
最后,我们返回j指针的位置,这个位置之前的数都是不等于val的。
代码如下:
```
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0, j = 0;
while (i < nums.size()) {
if (nums[i] != val) {
nums[j] = nums[i];
j++;
}
i++;
}
return j;
}
};
```
时间复杂度:O(n),其中n为数组的长度。
空间复杂度:O(1),我们只需要定义常数个额外的变量即可。
阅读全文