前言
秋招的結(jié)束,面試了大大小小的公司,最大的問題在于算法上。所以打算堅持在leetcode打卡,看看到底能不能行,如果你想見證,那我來開車,你坐穩(wěn),一起走向更好的遠方。2020=1024+996,準備好了?
一 題目
[26 刪除排序數(shù)組中的重復項]
給定一個排序數(shù)組,你需要在原地刪除重復出現(xiàn)的元素,使得每個元素只出現(xiàn)一次,返回移除后數(shù)組的新長度。不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
示例1
給定數(shù)組 nums = [1,1,2],
函數(shù)應(yīng)該返回新的長度 2, 并且原數(shù)組 nums 的前兩個元素被修改為 1, 2。
你不需要考慮數(shù)組中超出新長度后面的元素。
示例2
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數(shù)應(yīng)該返回新的長度 5, 并且原數(shù)組 nums 的前五個元素被修改為 0, 1, 2, 3, 4。
你不需要考慮數(shù)組中超出新長度后面的元素。
2 思路1---快慢指針
這里注意審題,數(shù)組本身已經(jīng)排序,重復的數(shù)字就是連續(xù)的喲。
我們先定義兩個指針,慢指針i和快指針,如果num[i]=num[j],我們就讓快指針j跳過重復項。如果num[i]!=num[j],那么久=nums[i++]=num[j],然后同時前進下面我們看看圖。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;
int i=0;
for(int j=1;j<nums.size();j++)
{
if(nums[j]!=nums[i])
{
nums[i+1]=nums[j];
i++;
}
}
return i+1;
}
};
3 思路1優(yōu)化
如果我們的排序數(shù)組沒有重復的元素,按照上面的思路我們會出現(xiàn)多余的復制操作,所以借此可以優(yōu)化一下。當num[i]!=nums[j],而且j-i>1的時候我們才進行復制,如下圖所示。

優(yōu)化后的代碼
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;
int i=0;
for(int j=1;j<nums.size();j++)
{
if(nums[j]!=nums[i])
{
if(j-i>1)
{
nums[i+1]=nums[j];
}
i++;
}
}
return i+1;
}
};
4 總結(jié)
今天學習了快慢指針去掉重復數(shù)的問題,在后面還會遇到指針相遇等問題也會有類似的思路喲!
希望讀者和咱一起一步一個腳印去把基礎(chǔ)知識打牢固。如果讀者發(fā)現(xiàn)有什么錯誤或者不太好的地方,歡迎私我,我會及時修改,同時如果覺得文章不錯請點擊右下角的在看或者轉(zhuǎn)發(fā)分享給身邊的小伙伴喲。關(guān)注就有免費書籍和視頻喲!