给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。 -
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [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] 解释:函数应该返回新的长度
5
, 并且原数组 nums 的前五个元素被修改为0
,1
,2
,3
,4
。不需要考虑数组中超出新长度后面的元素。
思路:利用双指针i和j,先固定i指针,j指针向右移动并判断两个指针所指元素是否相同,因为是有序数组,所以我们只需要排除相邻的相同项
1.如果相同,j继续移动
2.不同时(也就是说在此情况之前,i指针和j指针所指的元素是相同的),将j指针所指元素的值赋给i指针,i指针向右移动一格
以此类推
C++:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
int i = 0;
for (int j = 0; j < n; ++j) {
if (nums[j] != nums[i]) {//j指针如果与i指针所指元素相同,j指针就向右移动一格,不相同则i指针移动
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
};
Python:
class Solution(object):
def removeDuplicates(self, nums):
i,j=0,0
while j < len(nums):
if nums[i]!= nums[j]:
i+=1
nums[i]=nums[j]
else:
j+=1
return i+1