題目描述:給一個(gè)數(shù)組和一個(gè)值,去掉這個(gè)數(shù)組中所有等于這個(gè)值的元素,返回處理后的數(shù)組長(zhǎng)度。要求原地操作,可更改元素順序。
分析:雙指針的應(yīng)用,設(shè)指針 k 指向目前不等于給定值的最后一個(gè)元素的下標(biāo),遍歷數(shù)組的同時(shí)判斷元素是否為給定值,不是則 A[k++] = A[i],否則不處理。 時(shí)間復(fù)雜度O(n),空間O(1)。
方法一:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = 0;
for (int i = 0; i < nums.size(); i ++)
if (nums[i] != val)
nums[k ++] = nums[i];
return k;
}
};
方法二:用C++ STL函數(shù)一句話即可。remove(nums.begin(), nums.end(), val)); 效果是刪除迭代器區(qū)間中所有值為val的元素,實(shí)際上并未從內(nèi)存中刪除,只是移動(dòng)了位置,返回進(jìn)行刪除操作后,最后一個(gè)元素的位置。要真正刪除還需 nums.erase(remove(nums.begin(),
nums.end(),val), nums.end());
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
return distance(nums.begin(), remove(nums.begin(), nums.end(), val));
}
};