[東哥的leetcode刷題日記] leetcode 26 : Remove Duplicates from Sorted Array

leetcode 26 : Remove Duplicates from Sorted Array


題目鏈接: https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
難度: 簡單
歸類 : 數組操作

題目:

給定一個排序數組,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 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。
你不需要考慮數組中超出新長度後面的元素。


解法:

主要使用c++和python等兩種語言進行了解答,以及經典題解和嘗試改進的最優/最簡潔解法。


個人解法

設置curValue = nums[0]和curIndex=1,尋找下一個不等於curValue的值a,令curValue =a, nums[curIndex] = curValue,並使得curIndex加1。

C++解法

#c++解法
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        if(len < 2) return len;
        int curValue = nums[0];
        int curIndex = 1;
        for(int i = 1; i < len; i++){
            if(nums[i] != curValue){
                curValue = nums[i];
                nums[curIndex++] = curValue;
            }
        }
        return curIndex;
    }
};

時間複雜度: O(N)
空間複雜度: O(1)
提交結果:
執行用時 :16 ms, 在所有 C++ 提交中擊敗了83.54%的用戶
內存消耗 :7.6 MB, 在所有 C++ 提交中擊敗了100.00%的用戶

python解法

#python解法
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        length = len(nums)
        if length < 2:
            return length
        curValue = nums[0]
        curIndex = 1
        for i in range(length):
            if curValue != nums[i]:
                curValue = nums[i]
                nums[curIndex] = curValue
                curIndex += 1
        return curIndex

時間複雜度: O(N)
空間複雜度: O(1)
提交結果:
執行用時 :36 ms, 在所有 Python3 提交中擊敗了98.55%的用戶
內存消耗 :14.8 MB, 在所有 Python3 提交中擊敗了8.16%的用戶


題解優解

此題要求空間複雜度爲O(1),在原始數組上進行修改刪除操作。單指針法和雙指針法均可以解決。

附上力扣官方提供的雙指針法解決,代碼非常優雅。

數組完成排序後,我們可以放置兩個指針i和j,其中i是慢指針,而j是快指針。只要 nums[i] = nums[j],我們就增加j以跳過重複項。
當我們遇到 nums[j]不等於nums[i]時,跳過重複項的運行已經結束,因此我們必須把它(nums[j])的值複製到 nums[i + 1]。然後遞增 i,接着我們將再次重複相同的過程,直到j到達數組的末尾爲止。

#c++解法
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]) {
                i++;
                nums[i] = nums[j];
            }
        }
        return i + 1;
    }
};

時間複雜度: O(N)
空間複雜度: O(1)
提交結果:
執行用時 :16 ms, 在所有 C++ 提交中擊敗了83.54%的用戶
內存消耗 :7.7 MB, 在所有 C++ 提交中擊敗了100.00%的用戶


嘗試改進的最優解法

本題較爲簡單,無更優解法。調庫算法僅供娛樂,學技術還是得用底層數據結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章