力扣 26 删除有序数组中的重复项

26. 删除有序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

 

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

 

 


提示:

  • 0 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按升序排列

根据示例可知,将nums 112变成122,然后返回2,得到[1,2]

选择 i 和 j,j 往前遍历,i 为不重复的数字个数,

如 1 1 2 2 3

j=1,如果 第 j 个和第 j-1相等:j 往前走,即1==1,所以 j++, j=2

如果 第 j 个和第 j-1 不相等,即1!=2,将 i+1, nums[i]也就是1的值改为2

以此类推,i 是不重复的数字的下标,j是一直往前走,寻找不重复的数字,每找到一个不重复的数字,就将i+1,nums[i]的值改为这个数字,

所以前i+1个数字都是不会重复的,返回 i+1

 1 class Solution {
 2 public:
 3     int removeDuplicates(vector<int>& nums) {
 4         
 5         int len=nums.size();
 6         int i=0;
 7         int j=i+1;
 8         if(len==0){//为空就返回0
 9            
10             return 0;
11         }
12         while(j<len){
13             if(nums[j]==nums[j-1]){
14                 j++;
15             }else{
16                 i++;
17                 nums[i]=nums[j++];
18             }
19         }
20         return i+1;
21     }
22 };

 

posted @ 2022-01-21 13:43  付玬熙  阅读(25)  评论(0编辑  收藏  举报