題目
給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組 並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數組 nums = [1,1,2], 函數應該返回新的長度 2, 並且原數組 nums 的前兩個元素被修改爲 1, 2。
你不需要考慮數組中超出新長度後面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],函數應該返回新的長度 5, 並且原數組 nums 的前五個元素被修改爲 0,
1, 2, 3, 4。 你不需要考慮數組中超出新長度後面的元素。
代碼
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int length = nums.size();
if(!length) return 0;
int j=0;
for(int i=1;i<length;i++)
{
if(nums[i]!=nums[j])
nums[++j] = nums[i];
}
return j+1;
}
};
雙下標法,i下標指向舊的有重複元素的nums,j下表指向新的沒有重複元素的nums。當nums[i]與nums[j]不相同時,在nums[j]中添加nums[i],j向後移動。最後j的長度便是nums的新長度。
小技巧:可以通過減少vector函數的調用來降低運行時間,爲此創建了length變量。
結果
另外給出兩種STL的解法,不過效率都不太好
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
return distance(nums.begin(),removeDuplicates(nums.begin(),nums.end(),nums.begin()));
}
template<typename InIt,typename OutIt>
OutIt removeDuplicates(InIt first,InIt last,OutIt output)
{
while(first!=last)
{
*output++ = *first;
first = upper_bound(first,last,*first);
}
return output;
}
};
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
return distance(nums.begin(),unique(nums.begin(),nums.end()));
}
};