标题Leetcode每日刷题:26,删除有序数组的重复项
- 从今天起,leetcode除了每日一题更新,还会从头开始,按照leetcode题解的顺序来刷题,保持1-3题左右,会给出十分详细的解释,(自己给自己讲一点问题都不能放过)
- 这个是自己跟自己讲的全过程,所以非常口语化,以后慢慢规范一些;
- 今天先更新一题
题目思路:
- 显然这是一道简单题,删除有序数组的重复项
- 注意,是有序数组,说明什么?数组的排列会如下这样
- 同一个数字重复会连续出现,所以我们想到什么?对,快慢指针,之前复习王道数据结构,里面有很多类似题目
- 初始 slow 和fast 指向同一个位置,如果num[slow]==num[fast] 说明出现重复数字,则fast++
- 否则 将nums[++slow] = num[fast],这个时候直接将fast元素移至slow的下一个位置,所以是前++
- 前++和后++如果不明白可以看我的JAVA基础复习系列,里面有说明
- 最后返回 slow+1; 为什么要是slow+1,因为外层循环由fast控制,最后fast比slow快一个
class Solution {
public int removeDuplicates(int[] nums) {
//移除有序数组的重复数组
//因为数组有序,所以出现重复的删除即可,元素往前移动
//但是现在有个问题是,如果每删除一个重复的就移动,会重复操作很多次
//所以需要设计一个快慢指针
int slow = 0;
int fast = 0;
while(fast<nums.length)
{
if(nums[slow]==nums[fast])
{
fast++;
}
else
{
nums[++slow] = nums[fast];
}
}
return slow+1;
}
}
第二种解法:
这样的过程,但是仍然要多次移动,比上面还费力气,本来代码里面的注释是按照这个方法写的,但是太耗时了哈哈哈哈哈