解题思路:
1.获取信息:
给定一个非严格递增数列的数组,进行去重操作,返回数组中不重复元素的数目
要求:在原数组上进行去重操作(意思就是,不让使用额外辅助空间)
并且,不重复元素在数组中的相对位置保持不变
它检验的标准:(有些题会给出它检验的标准,除了可以方便你理解外,你还可以根据它实现越狱操作,不过不建议耍小聪明)它会根据你返回的不重复元素的数量来遍历你去重后的数组的前几个数是否和正确答案一致,所以,它只管前几个数,后面的数和数组的大小它不会管的
2.分析题目:
它只会管数组前k个数是否和正确答案一致,所以我们可以使用双指针去进行覆盖操作,(下面我会借着代码给你详细讲解,你看到这里可以先自己想一下该怎么实现,再到下面去对答案嘛)
3.示例查验:
示例1:(提醒了题读的快但漏的多的各位)它只会管前k个数符不符合标准
示例2:你可以看着这个示例来理解什么叫做非严格递增数列
4.尝试编写代码:
(1)双指针法(覆盖法)
思路:我们准备两个指针,分别放在第一个元素和第二个元素上,对它们指向的元素进行比较,那么,接下来无非就两种情况:
1.两者相同:
就移动后面的那个指针到下一位
2.两者不同:
移动前面的那个指针到下一位,再将后面那个指针指向的元素赋值给前面那个指针指向的元素,之后将后面的那个指针移动到下一位
直到后面那个指针触碰到数组的边界为止,以下是完整代码
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int size=nums.size();//声明数组的边界(就是它的大小)
if(size==1)return 1;//如果大小为1就直接返回
int p1=0,p2=1;//将指针放好
while(p2<size){//如果p2超出边界,就跳出循环
if(nums[p2]==nums[p1])p2++;//如果相同
else{p1++;nums[p1]=nums[p2];p2++;}//如果不同
}
return p1+1;//返回不重复元素的大小
}
};
(2)反骨法
反骨法,它又来了,它的核心思想就是耍无赖,你不让我用辅助空间,我偏要用呢?
当然是可以的,下面是完整代码,但是还是不推荐,毕竟是小家子气,上不得台面,看看就行了
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int>res;
for(int& num:nums){
if(find(res.begin(),res.end(),num)==res.end())res.push_back(num);
}
nums.swap(res);
return nums.size();
}
};
好了,今天的每日一题又结束了,希望可以帮上你的忙
还是提一嘴,纸上得来终觉浅,绝知此事要躬行