力扣面试经典150题打卡

题目链接: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] = 2slow = 3
  • fast = 4(指向 2):比较 nums[1] = 1 和 nums[4] = 2 → 不等 → 保留,nums[3] = 2slow = 4
  • fast = 5(指向 3):比较 nums[2] = 2 和 nums[5] = 3 → 不等 → 保留,nums[4] = 3slow = 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值