删除排序数组中的重复项

开个坑,准备跟着LeetCode的初级算法课程,一周一道题吧,这种事最难坚持了,每周发个博客,有仪式感一点。

首先是题目描述:

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

相关标签:数组 双指针

思路:

刚看到时,首先想到的是,遍历一遍,然后用新数组存,不过题目要求O(1)空间,得换一个思路。然后想到的是,遍历一遍,然后一直把之后的数组往前移,不过这个时间复杂度O(n2),也不行。往下翻到了标签,双指针!这题最后的结果肯定是要前面的都是升序排列,不同数字的,可以用双指针,一个指向已处理的升序数组的最后面,后面的指针一直往后移,直到找到与前指针不同的,放到前指针后面,不断循环,直到后面的指针走到数组最后,前面指针指的就是原数组删除重复元素后,升序数组的最后一位,返回它所在位置加1,就是答案。

代码:

public int removeDuplicates(int[] nums) {
    if (nums.length == 0) {
        return 0;
    }
    // 指向不重复数字头部位置
    int point1 = 0;
    // 寻找下一个不重复的数字
    int point2 = 0;
    while (true) {
        while (point2 < nums.length && nums[point1] == nums[point2]) {
            point2++;
        }
        if (point2 == nums.length) {
            return point1+1;
        }
        nums[++point1] = nums[point2];
    }
}

初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值