leetcode_删除有序数组中的重复项

    最近要刷leetcode了,所以写在这里。

一、题目要求

 

 二、解题思路

    我最开始的想法很简单,就是从前往后遍历,然后找到不一样的值,把重复的值删除

    代码如下:(C++)

 1 class Solution {
 2 public:
 3     int removeDuplicates(vector<int>& nums) {
 4         int present_data=0;
 5         int after_data=0;
 6         int length = nums.size();
 7         int result_number = 0;
 8         for(int i=0; i<length-1; i++)
 9         {
10             present_data = nums[i];
11             result_number = i;
12             //检验present_data后面的数据,是否与其相等
13             for(int j=i+1; j<length; j++)
14             {
15                 after_data = nums[j];
16                 if(after_data==present_data)
17                 {
18                     //如果相等则记录位置
19                     result_number = j;
20                 }
21                 //不相等则跳出
22                 else
23                     break;
24             }
25             result_number +=1;
26             //如果存在重复值,删除掉区间[i+1, result_number)
27             if(result_number-i>1)
28             {
29                 nums.erase(nums.begin()+i+1,nums.begin()+result_number);
30                 length = nums.size();
31             } 
32         }
33         return nums.size();
34     }
35 };

三、提升改进

    虽然算法通过了验证,但是效果并不好。

    后来我看了别人的方法,发现自己没有理解程序的意思,被“删除”误导了,我以为删除真的在内存里面删除,但是实际上它的删除只是输出数组前length个变量,保证这些变量不重复就好了。

    一个比较好的方法如下:

1 int removeDuplicates(vector<int>& nums) {
2     if (nums.size() < 2) return nums.size();
3     int j = 0;
4     for (int i = 1; i < nums.size(); i++)
5         if (nums[j] != nums[i]) nums[++j] = nums[i];
6     return ++j;
7 }
View Code

    这告诉我,要仔细理解题目意思,不用真正删除其物理空间,其实也没有必要。

 

posted @ 2021-10-24 14:29  星光夜  阅读(51)  评论(0)    收藏  举报