問題描述
給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 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。
你不需要考慮數組中超出新長度後面的元素。
解法
使用雙指針pre
和p
分別指向第一個不重複的元素和當前循環元素,則在循環指針移動的時候判斷值是否相同,若相同,移動交換pre
和p
指針所指向的內容,然後後移pre
和p
,否則,只後移p
指針。重複以上過程直至p
到達數組末尾。返回pre+1
即爲新數組大小
複雜度
首先至少要遍歷一遍數組,故時間複雜度爲O(n),而空間上只需要原地交換元素即可,複雜度O(1)。
C++
static const auto io_sync_off=[](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(size(nums)<=1)return size(nums);
int p=1,pre=0,len=size(nums);
while(p<len){
if(nums[pre]==nums[p])
p++;
else{
nums[pre+1]=nums[p];
p++;
pre++;
}
}
return pre+1;
}
};
Python
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if nums is None:
return
if len(nums)<=1:
return len(nums)
pre=p=0
LEN=len(nums)
while p<LEN:
if p==pre:
p+=1
continue
if nums[p]==nums[pre]:
p+=1
else:
nums[pre+1]=nums[p]
p+=1
pre+=1
return pre+1