赞
踩
目录
给你一个有序数组 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!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。