原题:
Given an array nums and a value val, 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 by modifying the input array in-place with O(1) extra memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example 1:Given nums = [3,2,2,3], val = 3, Your function should return length = 2, with the first two elements of nums being 2. It doesn't matter what you leave beyond the returned length.
Example 2:Given nums = [0,1,2,2,3,0,4,2], val = 2, Your function should return length =
5
, with the first five elements ofnums
containing0
,1
,3
,0
, and 4. Note that the order of those five elements can be arbitrary. It doesn't matter what values are set beyond the returned length.
原题写的挺绕的其实就是从一列数中删除某些元素,要求使用原地算法,就是直接替换数组元素,原理就是两个pointer xy,y碰到非目标元素就将个元素的值赋给x,结果如下:
Success
Runtime: 4 ms, faster than 100.00% of C++ online submissions for Remove Element.
Memory Usage: 8.5 MB, less than 100.00% of C++ online submissions for Remove Element.
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i=0;
for(int j=0;j<nums.size();j++){
if(nums[j]!=val){
nums[i]=nums[j];
i++;
}
}
return i;
}
};
当然也可以设置头尾两个指针,结果如下:
Success
Runtime: 4 ms, faster than 100.00% of C++ online submissions for Remove Element.
Memory Usage: 8.5 MB, less than 100.00% of C++ online submissions for Remove Element.
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0;
int n = nums.size();
while (i < n) {
if (nums[i] == val) {
nums[i] = nums[n - 1];
n--;
} else {
i++;
}
}
return n;
}
};