给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
nums
,使 nums
的前 k
个元素包含唯一元素,并按照它们最初在 nums
中出现的顺序排列。nums
的其余元素与 nums
的大小不重要。k
26. 删除有序数组中的重复项 - 力扣(LeetCode)
我的解题思路:
- // 推导过程 (双指针)
- |
- 0,0,1,1,1,2,2,3,3,4
- |
-
- |
- 0,0,1,1,1,2,2,3,3,4
- |
-
- |
- 0,1,1,1,1,2,2,3,3,4
- |
-
- |
- 0,1,1,1,1,2,2,3,3,4
- |
-
- |
- 0,1,1,1,1,2,2,3,3,4
- |
-
- |
- 0,1,2,1,1,2,2,3,3,4
- |
-
- |
- 0,1,2,1,1,2,2,3,3,4
- |
-
-
- |
- 0,1,2,3,1,2,2,3,3,4
- |
-
- |
- 0,1,2,3,1,2,2,3,3,4
- |
-
- |
- 0,1,2,3,1,2,2,3,3,4
- |
-
- |
- 0,1,2,3,4,2,2,3,3,4
- |
我的code:
-
- // 26. 删除有序数组中的重复项 (请你 原地 删除重复出现的元素)
- class Solution {
- public:
- int removeDuplicates(vector<int>& nums) {
- int i=0,j=1;
- if(nums.size()==0) return 0;
- if(nums.size() == 1) return 1;
- for(;i
size() && jsize();) { - while(j < nums.size() && (nums[i] == nums[j])) {
- j++;
- }
- ++i;
- if(i
size() && jsize()) - nums[i] = nums[j];
- }
- return i;
- }
- };
简化code
- // 简化
- class Solution {
- public:
- int removeDuplicates(vector<int>& nums) {
- if(nums.size()==0) return 0;
- int p=0,q=1;
- while(q < nums.size()) {
- if(nums[p]!=nums[q]) {
- nums[p+1] = nums[q];
- p++;
- }
- q++;
- }
- return p+1;
- }
- };
官方code:
- 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)
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析
时间复杂度:O(n)O(n)O(n),其中 nnn 是数组的长度。快指针和慢指针最多各移动 nnn 次
空间复杂度:O(1)O(1)O(1)。只需要使用常数的额外空间