题解
我们要删除一个排序数组中的重复项,并返回它的数组长度。基本的思路是让排序数组中的所有量进行比较,并且把所有不同的量更新存入一个数组中。
简化要点:
1.并不是所有的数组都需要比较,仅有一项的数组并不需要比较,可将它单独列出。
2.这是一个排序数组!!!(划重点)这就意味着如果原数组中重复项,那么他们必然相邻。二期因为排序,所以可以通过考虑实际情况来选择是用“!=”还是“<”或者“>”。
解题思路
基础思路
考虑到排序数组的特性,我一开始打算利用重复项必然相邻的特点删除掉数组中的重复项。代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 2) return nums.size();
int j=1;
for(int i=0;i<nums.size()-1;i++){
if(nums[i]!=nums[i+1]){
nums[j]=nums[i+1];
j++;
}
}
return j;
}
};
运行结果如下显示:
可以很明显的看到,按照这个算法时间上对于我这样的菜鸟级别新手还算说得过去,但内存消耗有点大,所以我试图改进我的算法。我试着用双指针暴力破解法,代码如下:
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size()<2) return nums.size();
int j=0;
for(int i=1;i<nums.size();i++)
if(nums[j]!=nums[i]){
nums[++j]=nums[i];
}
return j+1;
}
};
经过试验我发现,我的方法和暴力破解法没有多大差别。
改进思路
之后在翻阅其他人的解题记录时,我突然想到一个新的思路:还是相邻比较法,但是如果一个项和它前面的项相等且与后面的项不相等,那么就把后面的项赋值给那一项,以此类推,为了防止最后两项相等的情况出现,我们将最后输出的值减去1;这个算法的难点就在于如何解决3个或者超过3个的项同时相同的问题。为了解决这个问题,我打算引入另外一个数组指针nums[j].在多次试验以后我发现如果使用For语句循环,很难将项放到想要的位置,因为i的变化是固定的。经过多次反复试验以后
得到如下代码;
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 1;
int j = 2;
while(j <= nums.size() && i < nums.size()){
if(nums[i] <= nums[i-1] && j < nums.size()){
nums[i] = nums[j];
j++;
}else if(nums[i] > nums[i-1])
i++;
else
j++;}
return i;
}
};
但是我实在找不出原因,系统错因显示如下: