目录
题目
给你一个有序数组 nums ,请你原地 删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
分析
方法1:双指针。因为当数组内的元素为0个时,直接返回0,当元素为1个时,直接返回元素本身,只有当元素数量>1时,需要处理,所以两个指针的起始位置均放在下标为1的地方,left指针为整理好的序列的尾部,right指针为为整理的序列的头部位置,将nums[right]和nums[right-1]比较,若不同,nums[right]赋值给nums[left],left指针右移一位,若相同,right指针继续右移。
复杂度分析
时间复杂度:O(n),其中 n是数组的长度。快指针和慢指针最多各移动 n 次。
空间复杂度:O(1)。只需要使用常数的额外空间。
代码
# python
方法1:双指针
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
left,right = 1,1
while right < n:
if nums[right] != nums[right-1]:
nums[left] = nums[right]
left += 1
right += 1
return left
执行用时:40 ms, 在所有 Python3 提交中击败了57.86%的用户
内存消耗:15.5 MB, 在所有 Python3 提交中击败了17.59%的用户
//c++
方法1:双指针
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if(n==0){
return 0;
}
int left = 1,right = 1;
while (right < n){
if (nums[right] != nums[right-1]){
nums[left] = nums[right];
++left;
}
++right;
}
return left;
}
};
执行用时:12 ms, 在所有 C++ 提交中击败了57.86%的用户
内存消耗:18 MB, 在所有 C++ 提交中击败了6.45%的用户
参考
26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)
点个赞吧!
The end!