题目链接:26. 删除有序数组中的重复项 - 力扣(LeetCode)
解题思路:
本题较为简单,这种思路运用了快慢指针的方法
方法一:
1获取数组的长度,避免数组为空(数组长度为0),这种情况直接返回0即可
2 定义两个指针,一个快指针,一个慢指针,其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度
3慢指针的目的值记录数组中出现一次数字的个数,快指针用于作为遍历数组的索引
4循环中的逻辑就是,如果相邻的两个数字不相同,就是这个数字出现过一次(题目隐含条件,数组为递增),出现过一次,就让slow++即可,然后将快指针的索引地方的值赋值给慢指针,通过这不操作,将数组前移,重复的的地方直接无数字
5返回结果slow
class Solution {
public int removeDuplicates(int[] nums) {
int len = nums.length;
if(len==0){
return 0;
}
int fast=1;
int slow=1;
while(fast<len){
if(nums[fast]!=nums[fast-1]){
nums[slow] = nums[fast];
//slow计算只出现过一次数字的次数
slow++;
}
fast++;
}
return slow;
}
}
方法二
核心思路,用一个栈来记录当前数组的数字,栈的大小设置为1,只有遍历过程中的下一个数字和栈顶元素不相同的时候,才可以进栈,进栈以后,计数器stackSize++,最后返回这个计数器即可
class Solution {
public int removeDuplicates(int[] nums) {
int len = nums.length;
int stackSize = 1;
for(int i=1;i<len;i++){
if(nums[i]!=nums[i-1]){
nums[stackSize] = nums[i];
stackSize++;
}
}
return stackSize;
}
}
题目链接:80. 删除有序数组中的重复项 II - 力扣(LeetCode)
解题思路:
方法一:
这题和第一题有点类似
1:本题要求的是不能存在相同数字次数超过两次的数字,超过两次就将他删除到只能出现两次
2:第一种方法仍然是使用一个快慢指针,慢指针表示现在已经处理好的数组的长度,快指针表示已经遍历的数组的长度
3判断数字是否超过三次,就要找快指针所在的索引的上上一个位置,可以清楚的发现是nums[slow-2]
这里面不清楚的话我们也可以举一个例子来看一下
以数组 [1, 1, 1, 2, 2, 3] 为例:
- 初始:
slow = 2(前 2 个元素[1,1]已有效),fast = 2(指向第 3 个元素1)。 - 比较
nums[slow-2] = nums[0] = 1和nums[fast] = 1:相等 → 说明加入后会有 3 个1,跳过(slow不变,fast++)。 fast = 3(指向2):比较nums[0] = 1和nums[3] = 2→ 不等 → 保留,nums[2] = 2,slow = 3。fast = 4(指向2):比较nums[1] = 1和nums[4] = 2→ 不等 → 保留,nums[3] = 2,slow = 4。fast = 5(指向3):比较nums[2] = 2和nums[5] = 3→ 不等 → 保留,nums[4] = 3,slow = 5。
最终有效数组为 [1,1,2,2,3],长度 5,符合「每个元素最多 2 次」的要求。
4所以循环中的判断条件变为nums[slow-2]!=nums[fast].
5最后结束循环返回结果即可
class Solution {
public int removeDuplicates(int[] nums) {
int len = nums.length;
if(len<=2){
return len;
}
int fast=2;
int slow = 2;
while(fast<len){
if(nums[slow-2]!=nums[fast]){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
方法二
方法二仍然是用到数据结构中的栈
1这里的栈的大小为2,这里面的栈顶元素就相当于解法一中的nums[slow-2],如果相同,就说明有起码有三个相同的数组出现,
2也就是说,只要nums[i]等于栈底元素,就说明这个数字至少出现三次了,就不能入栈
看下面的举例说明
例子数组[1,1,1,2,2,3]

class Solution {
public int removeDuplicates(int[] nums) {
int stackSize = 2;
for(int i=2;i<nums.length;i++){
if(nums[i]!=nums[stackSize-2]){
nums[stackSize] = nums[i];
stackSize++;
}
}
return stackSize;
}
}
663

被折叠的 条评论
为什么被折叠?



