前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。
题目链接https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 这是一道有序数组的问题,理论上用快慢指针的方法搞定。先说一下,这里的指针不是许多人学C语言入门到入土的那个指针,就是个记录数组下表的东西。因为题目上明确提出是有序数组,所以重复项都是紧挨着的,这个时候可以用这个方法来做。
现在来解释一下什么是快慢指针,事实上我看到这道题的题解里有视频教程,但我还是说一下吧:两个指针从第一项也就是nums[0]开始向右遍历,如果第一个指针和第二个指针的值相同,则第一个指针向右移动一格,第二个指针不变;如果两指针值不相同,第二个指针向右移动一格并将这个格里的数字改变为第一个指针所指向的值,然后再如此反复知道第一个指针遍历结束。我们不难看出第二个指针永远在第一个指针的后面,所以我们称它们叫快慢指针。
下面是我的AC代码:
class Solution {
int fast,low,L;
public:
int removeDuplicates(vector<int>& nums) {
L = nums.size();
if(!L){
return 0; //需要排除L==0的情况
}
for(;fast<L;fast++){ //fast已经定义过了
if(nums[fast]!=nums[low])nums[++low]=nums[fast];
}
return low+1; //我们low指向的是第low+1个元素
}
};
当然如果这道题目没有提出O(1)的空间复杂度要求,我们或许能用<set>库或者<map>库解决这道题;如果题目中是无序数组,我们还可以用<algorithm>库中的sort()函数给他排个序。我们应当尝试一下其他的费时(时间复杂度)费力(空间复杂度)费脑子(代码复杂度)的方法,这样才可以在遇到做不出来的题目时用这些小方法去骗到更多的分,毕竟:
骗分过样例,暴力出奇迹。暴搜挂着机,打表出省一。