给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素, 使每个元素 只出现一次,返回删除后数组的新长度。元素的相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k, 你需要做以下事情确保你的题解可以被通过: 更改数组 nums,使nums的前k个元素包含唯一元素,并按照它们 最初在 nums中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k。 示例 1: 输入:nums =[1,1,2] 输出:2,nums =[1,2,_] 解释:函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1,2。 不需要考虑数组中超出新长度后面的元素。
解题思路:
1.要求原地删除排序数组中的重复元素,每个元素只出现一次,并返回去重后数组的长度。
2.可以定义双指针slow和fast都为0(指向数组开头索引为0),slow指针指向已经处理的不重复的末尾位置,fast指针用于遍历整个数组。
3.当fast指向遍历数组时,如果nums[fast]与nums[slow]不相等,说明找到了一个新的不重复元素。此时,将slow指针向前移动一位(slow+=1),然后把nums[fast]的值赋给nums[slow],这样就将新的不重复元素放到了正确的位置。
4.如果nums[fast]与nums[slow]相等,说明遇到了重复元素,此时不需要做任何处理,只需要继续移动fast指针即可。
5.当fast的针织遍历完整个数组后,slow指针指向的位置就是去重后的数组中不重复的末尾位置。由于数组索引从0开始,所以去重后数组的长度就是slow+1。
代码解析:
1.首先判断输入的数组nums是否为空,如果为空则直接返回0,表示没有不重复的元素。
2.然后初始化slow和fast指针都为0。
3.进入while循环,只要fast指针小于数组nums长度,就继续循环:
当nums[fast]不等于nums[slow]时,就说明找到了新的不重复元素。现将slow指针加1,然后
把nums[fast]的值赋给nums[slow],这样就把新的不重复元素放到了正确的位置(即紧跟再之前的不重复元素后面)
无论是否找到新的不重复元素,每次循环都将fast指针加1,使其继续向后遍历数组。
当fast指针遍历完整个数组后,slow指针指向的位置就是去重后数组中不重复元素的末尾位置。最后返回slow+1,即为去重后数组的长度。
最后fast遍历完数组,slow=1,返回slow+1=2,此时nums数组变为【1,2,—】(这里—表示不需要关注的位置)