双指针 原地 删除数组

leetcode地址:26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M276https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

本题给你升序数组,需要你原地 删除数组中的重复部分,返回相对顺序保持一致的新数组

 

对于我这样的算法小白而言,真的是没有任何思路,只能用拙劣的思维去考虑(大佬轻喷...)

我的脑海中是有个大概的感觉:应该是双指针可以很快的解决 但是奈何我一句也憋不出来

我只好去卑微的看题解了....

public class eazy26 {
    public static void main(String[] args) {
        int[] a = {0,0,1,1,1,2,2,3,3,4};
        System.out.println(removeDuplicates(a));
    }
    public static int removeDuplicates(int[] nums) {
      int n = nums.length;
      int slow=1,fast=1;  //定义双指针;
      while (fast<n){
          if(nums[fast-1]!=nums[fast]){
              nums[slow] = nums[fast];
              slow++;
          }
          fast++;
      }
      return slow;
    }
}

运行结果: 5

我的理解:

首先定义双指针,一个快指针,一个慢指针;慢指针指向数组中等待替换的位置,如000012 这个数组,第一轮的慢指针指向1位置即第二个0,快指针每次循环都要往后指一位,目的是判断是否相等,由于它变化快,所以命名快指针。
当fast<n则进入循环,当后一位不等于前一位的时候,就需要去替换慢指针。然后让满指针指向下一位,如果相等的话,无所谓,我们只需要让快指针进行下一次比价即可。直到遇到不相等的,便去替换。然后slow再加1。当fast大于n后,就说明整条数组都遍历完了,数组已经删除完毕。最后返回一个slow,由于每次替换后,就相当于最终数组个数多一个。这个slow即使代表着数组的下标(指针作用),控制着替换的对应元素,同时也是代表着新数组的个数。这个逻辑很重要。

本题最大的限制是原地操作,也就是说,空间复杂度必须是O(1) ! 即不能额外开辟空间去存储数组元素!所以就需要用到指针的概念了,虽然在Java中,已经明确删除指针,但是我认为这里的指针不是工具,而是一种思想!

新手小白,请大佬指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值