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

文章目录

  • 前言
  • 一、题目
  • 二、解题方法
    • 1.什么是双指针
    • 2.使用双指针方法
      • 时间复杂度简介
      • 空间复杂度简介
  • 总结


前言

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


一、题目

此时给定一个排序数组代表的是这个数组是有序的,只会出现1,1,2,3;而不会出现1,2,2,1这种情况。
算法笔记(2):删除排序数组中的重复项_第1张图片

二、解题方法

1.什么是双指针

我们可以放置两个指针n和i,其中n是慢指针,i是快指针。
算法笔记(2):删除排序数组中的重复项_第2张图片

如果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));

输出结果:
算法笔记(2):删除排序数组中的重复项_第3张图片

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

时间复杂度简介

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

空间复杂度简介

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

总结

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

你可能感兴趣的:(算法,java,算法)