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%的用戶
嘗試改進的最優解法
本題較爲簡單,無更優解法。調庫算法僅供娛樂,學技術還是得用底層數據結構。