前言
秋招的結束,面試了大大小小的公司,最大的問題在於算法上。所以打算堅持在leetcode打卡,看看到底能不能行,如果你想見證,那我來開車,你坐穩,一起走向更好的遠方。2020=1024+996,準備好了?
一 題目
[26 刪除排序數組中的重複項]
給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 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。
你不需要考慮數組中超出新長度後面的元素。
2 思路1—快慢指針
這裏注意審題,數組本身已經排序,重複的數字就是連續的喲。
我們先定義兩個指針,慢指針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優化
如果我們的排序數組沒有重複的元素,按照上面的思路我們會出現多餘的複製操作,所以藉此可以優化一下。當num[i]!=nums[j],而且j-i>1的時候我們才進行復制,如下圖所示。
優化後的代碼
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 總結
今天學習了快慢指針去掉重複數的問題,在後面還會遇到指針相遇等問題也會有類似的思路喲!
希望讀者和咱一起一步一個腳印去把基礎知識打牢固。如果讀者發現有什麼錯誤或者不太好的地方,歡迎私我,我會及時修改,同時如果覺得文章不錯點贊是對我最大的鼓勵喲,同時關注就領取免費書籍和視頻哈。