[圖解leetcode高頻面試之數組系列]3 刪除排序數組中的重複項

前言

秋招的結束,面試了大大小小的公司,最大的問題在於算法上。所以打算堅持在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 總結

今天學習了快慢指針去掉重複數的問題,在後面還會遇到指針相遇等問題也會有類似的思路喲!

希望讀者和咱一起一步一個腳印去把基礎知識打牢固。如果讀者發現有什麼錯誤或者不太好的地方,歡迎私我,我會及時修改,同時如果覺得文章不錯點贊是對我最大的鼓勵喲,同時關注就領取免費書籍和視頻哈。

發佈了34 篇原創文章 · 獲贊 65 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章