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 }
这告诉我,要仔细理解题目意思,不用真正删除其物理空间,其实也没有必要。
纵一苇之所如,临万顷之茫然。

浙公网安备 33010602011771号