算法笔记(2):删除排序数组中的重复项


前言

最近在学习算法,所以将学到的和大家分享一下。


一、题目

此时给定一个排序数组代表的是这个数组是有序的,只会出现1,1,2,3;而不会出现1,2,2,1这种情况。
在这里插入图片描述

二、解题方法

1.什么是双指针

我们可以放置两个指针n和i,其中n是慢指针,i是快指针。
在这里插入图片描述

如果nums1[n]=nums1[i],说明是重复项,我们让i自增,然后在比较nums1[n]和nums1[i]是否相等,如果还相等,说明还是重复项,继续让i自增,直到nums[n]!=nums1[i],说明重复项就结束了。
重复项结束之后,我们将不重复的值放到n+1的位置上去,同时n自增,i也自增,直到遍历完整个数组。当遍历完整个数组的时候,n及以前的元素都是不重复的,所以返回n+1即为不重复数组的长度。

2.使用双指针方法

代码如下:

  public int removenums(int[] nums1){
  
        // 首先判断数组是否为空
        if(nums1.length == 0){
            return 0;
        }
        // 定义慢指针
         int n = 0;
         
         // 定义快指针i是从0+1开始
          for (int i = 1;i < nums1.length;i++){
          
              // 如果快慢指针对应的值不相等,则n自增之后(这里是先自增)
              // 将快指针对应的值,赋值为n的位置(相当于原来n+1的位置)
             if(nums1[i] != nums1[n]){
                 n++;
                 nums1[n] = nums1[i];
             }
          }
          // 遍历结束,n+1为不重复的数组长度,返回即可。
         return n + 1;
    }

测试代码:

        Sigerithm1 sigerithm1=new Sigerithm1();
        int[] nums1 = {1,1,2,3,4,5};
        System.out.println(sigerithm1.removenums(nums1));

输出结果:
在这里插入图片描述

此方法的时间复杂度:O(n),假设数组长度为n,那么n和i分别最多遍历步。
空间复杂度:O(1)。

时间复杂度简介

算法的时间复杂度是一个函数,它定性的描述了该算法的运行时间。

空间复杂度简介

对一个算法在运行过程中临时占用储存空间大小的量度。

总结

以上就是今天的内容,算法的解题方法和思路有很多,所以小伙伴们可以大胆使用自己的思维去试试别的方法,一起加油吧!如果这篇文章对你有帮助的话,麻烦点下赞表示对作者的支持,感谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeChenF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值