自学内容网 自学内容网

力扣经典面试26题删除有序数组中的重复项1

给你一个非严格递增排列的数组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,—】(这里—表示不需要关注的位置)

                                                                 


原文地址:https://blog.csdn.net/HandsomeBoyqxc/article/details/143783515

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!