开个坑,准备跟着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)