题目要求:删除有序数组的重复项
-
描述:给你一个排序的数组
nums,请你删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums中唯一元素的个数。 -
题目类型:数组
-
难度:简易
示例 1:
输入: nums = [1,1,2]
输出: 2, nums = [1,2]
解释: 函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4]
解释: 函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
题解
👨🎓💭解决思路:这道题目要求是对给定的数组nums删除重复元素,删除原元素之后,每个元素都只出现一次,并返回新的数组长度,上述操作必须通过原地修改数组的方法完成。
由于给定数组nums是有序的,因此对于任意i<j,如果nums[i] = nums[j],则对任意i≤k≤j,必有nums[i]=nums[k]=nums[j],即相等的元素在数组中的下标一定是连续的。利用数组有序的特点,可以通过双指针的方法删除重复元素。
分别定义两个指针low和high分别为低指针和高指针,高指针表示遍历数组到达的下标位置,低指针表示下一个不同元素分别要填入的下标位置,初始时两个指针都指向下标1。
假设数组的长度为len,将高指针high依次遍历从1到len-1的每一个位置,对于每个位置,如果nums[high] != nums[high-1],说明nums[high]和前一个元素都不相同,因此将nums[high]的值复制到nums[low],然后将low的值加1,即指向下一个元素位置。
遍历结束后,从nums[0]到nums[low-1]的每个元素都不相同且包含原数组中的每个不同的元素,因此新的长度即为low,返回low即可。