27. Remove Element
Given an array and a value, remove all instances of that value in place and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
The order of elements can be changed. It doesn’t matter what you leave beyond the new length.
Example:
Given input array nums = [3,2,2,3], val = 3
Your function should return length = 2, with the first two elements of nums being 2.
分析
题目要求在不使用额外空间条件下删除一个数组中等于某个特定值所有元素,然后返回数组的长度;题目还说元素的顺序可以改变,并且在新数组长度之后的元素可以不关心。
其中一个解法和删除有序数组中的重复元素类似,使用一个索引记录当前新数组长度,然后依次遍历数组,元素不等于特定值时,长度+1,否则不变;
另一个方法是在元素和特定值相等时可以将其和最后一个元素进行交换,并将最后一个元素的索引前移,这种方法可以避免元素的复制操作。
源码
class Solution {
public:
// 方法1:因为可以打乱原来元素的顺序,所以可以在找到数后和最后一个数进行交换
int removeElement(vector<int>& nums, int val) {
int last = nums.size() ;
int i = 0;
while(i < last) {
if(nums[i] == val) { // 当前元素需要被删除
nums[i] = nums[last - 1]; // 将当前元素和最后一个元素交换
last--; // 最后元素位置前移,但当前检查元素位置不后移
} else {
i++; // 当前元素后移
}
}
return last;
}
// 方法一:数组长度索引
int removeElement(vector<int>& nums, int val) {
int index = 0;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] != val) {
nums[index++] = nums[i];
}
}
return index;
}
};