一、题目
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
二、我的解
class Solution { public: int removeDuplicates(vector<int>& nums) { vector<int> temp=nums; vector<int> end; end.push_back(temp[0]); for(int i=1;i<nums.size();i++){ for(int j=i-1;j>=0;j--){ if(temp[i]!=temp[j]){ end.push_back(temp[i]); break; } else{ break; } } } nums=end; return end.size(); } };
这段代码的效率不高,因为用到了vector遍历,其本身就是很占用内存的容器。
以下是在leetcode中运行的结果。可见,该段代码有很大进步空间。
三、更优解
方法:双指针
这是官方的做法,本方法运用了快、慢两种指针。
快指针指代元素当前位置,慢指针指代元素要插入的位置。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/728105/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。