继续打卡算法题,今天学习的是LeetCode第80题删除有序数组中的重复项 II,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
本题要求原地处理原数组,删除重复项,并且只能使用O(1)的额外空间。
由于是有序的,我们只要把未超过2个重复的数字记录下来就可以了。
怎么记录呢,使用一个slow下标表示需要记录的数字,一个fast下标用于循环原数组,一个pre字段记录前一个数字,一个字段count对某个数字计数。这就是双指针的做法。
循环原数组,依次按上图规律,把需要保留的数保留下来,最终slow指针指向最后一个数字的后一位,也就是保留下来的数的长度。
本题解题技巧
1、使用双指针,慢指针记录需要保留下来的下标,快指针遍历原数组。
编码解决
class Solution {
public int removeDuplicates(int[] nums) {
int slow = 1;
int pre = nums[0];
int count = 1;
for (int fast=1; fast<nums.length; fast++) {
if (pre == nums[fast]) {
count++;
if (count <=2) {
nums[slow] = nums[fast];
} else {
//相同的元素超过2个,跳过
continue;
}
} else {
pre = nums[fast];
count = 1;
nums[slow] = nums[fast];
}
slow++;
}
return slow;
}
}
总结
1、双指针处理一维数组很有用,特别是有序的数组,可以提高遍历的效率。