LeetCode刷题之删除有序数组中的重复项

2024/5/11,天气转阴,微风。睡眠质量良好,准备做题。

1、题目描述

在这里插入图片描述

2、逻辑思考

我的想法是:使用栈来处理,但是题目要求是原地删除,这里就不是很理解,遂看题解去啦。看了官方题解,双指针即可很好解决此问题,我咋就想不到嘞,真的是天才想法。程序员真是个神奇的群体。下面看代码:

代码演示

 public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if(n == 0){
            return 0;
        }
        int fast = 1 , slow = 1;
        while(fast < n){
            if(nums[fast] != nums[fast - 1]){
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }

逻辑思路很清晰,fast指针用于遍历数组中的每个元素,而slow指针则用于指向当前不重复序列的末尾。每当遇到一个不重复的元素时,就将其复制到slow指针的位置,并递增slow指针。这样,当fast指针遍历完整个数组后,slow指针之前(包括slow指针所指向的位置)的元素就是无重复的元素,而slow的值(即索引+1)就是新数组的长度。

时间复杂度:O(n),空间复杂度O(1)。

总结:在这段代码中,使用到的算法思想是双指针法(Two Pointers)或称为快慢指针法(Fast and Slow Pointers)。

双指针法通常用于在遍历数组或链表的同时,维护两个指针来执行某些操作。在这个特定的例子中,fast指针用于遍历整个数组,而slow指针则用于指向当前不重复序列的末尾。

  • fast指针用于遍历数组中的每个元素,检查当前元素是否与前一个元素不同。
  • slow指针用于指向当前不重复序列的末尾,并在找到不重复元素时,将fast指针指向的元素复制到slow指针的位置,并递增slow指针。

这种方法的关键在于,它只遍历数组一次,并且在遍历的过程中就完成了去除重复元素的操作,从而实现了线性时间复杂度O(n)和空间复杂度O(1)(因为只使用了常数个额外变量)。

好啦,今天的第一道题很简单,解决啦,不要忘记复习前面的知识哟,今天也是约了羽毛球,嘿嘿,过一会就要去啦。买了两瓶1.55L的怡宝,两瓶只用5元,赚啦!GOOD BYE!

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值