双指针秒解数组去重难题
双指针法解决删除排序数组中的重复项
问题描述
给定一个升序排列的数组 nums,要求原地删除重复出现的元素,使每个元素只出现一次,并返回新数组的长度。必须在不使用额外数组空间的条件下完成,仅修改输入数组。
核心思路
双指针法(快慢指针)是解决该问题的经典方法。通过维护两个指针(慢指针 slow 和快指针 fast),将非重复元素移动到数组前端。
算法步骤
初始化指针
定义 slow 和 fast 初始值为 0 和 1,分别指向数组的第一个和第二个元素。
遍历数组
快指针 fast 遍历数组,比较 nums[fast] 与 nums[slow]:
- 若
nums[fast] != nums[slow],说明遇到新元素,将slow右移一位,并将nums[fast]的值赋给nums[slow]。 - 若相等,则跳过(快指针继续右移)。
终止条件
当 fast 遍历完数组后,slow + 1 即为新数组的长度。
代码实现
def removeDuplicates(nums):
if not nums:
return 0
slow = 0
for fast in range(1, len(nums)):
if nums[fast] != nums[slow]:
slow += 1
nums[slow] = nums[fast]
return slow + 1
复杂度分析
- 时间复杂度:O(n),仅需一次遍历数组。
- 空间复杂度:O(1),仅使用常量额外空间。
示例演示
输入数组 nums = [1,1,2]:
slow=0,fast=1:nums[1] == nums[0],跳过。slow=0,fast=2:nums[2] != nums[0],slow右移,赋值nums[1] = 2。- 最终数组前
slow + 1 = 2位为[1,2],返回长度2。
边界情况处理
- 空数组:直接返回
0。 - 无重复元素:快慢指针同步移动,数组保持不变。
- 全重复元素:慢指针始终为
0,最终返回长度1。
方法优势
- 高效性:单次遍历即可完成操作。
- 原地修改:符合题目空间复杂度要求。
- 通用性:类似问题(如移除特定值)可套用此模板。
BbS.okapop184.sbs/PoSt/1122_500030.HtM
BbS.okapop185.sbs/PoSt/1122_096053.HtM
BbS.okapop186.sbs/PoSt/1122_392410.HtM
BbS.okapop187.sbs/PoSt/1122_405610.HtM
BbS.okapop188.sbs/PoSt/1122_311307.HtM
BbS.okapop190.sbs/PoSt/1122_338644.HtM
BbS.okapop191.sbs/PoSt/1122_031753.HtM
BbS.okapop192.sbs/PoSt/1122_822024.HtM
BbS.okapop193.sbs/PoSt/1122_578708.HtM
BbS.okapop194.sbs/PoSt/1122_750422.HtM
BbS.okapop184.sbs/PoSt/1122_550773.HtM
BbS.okapop185.sbs/PoSt/1122_509377.HtM
BbS.okapop186.sbs/PoSt/1122_255254.HtM
BbS.okapop187.sbs/PoSt/1122_852708.HtM
BbS.okapop188.sbs/PoSt/1122_620863.HtM
BbS.okapop190.sbs/PoSt/1122_774605.HtM
BbS.okapop191.sbs/PoSt/1122_823804.HtM
BbS.okapop192.sbs/PoSt/1122_637003.HtM
BbS.okapop193.sbs/PoSt/1122_431998.HtM
BbS.okapop194.sbs/PoSt/1122_632137.HtM
BbS.okapop184.sbs/PoSt/1122_900274.HtM
BbS.okapop185.sbs/PoSt/1122_646808.HtM
BbS.okapop186.sbs/PoSt/1122_633212.HtM
BbS.okapop187.sbs/PoSt/1122_548647.HtM
BbS.okapop188.sbs/PoSt/1122_613092.HtM
BbS.okapop190.sbs/PoSt/1122_654622.HtM
BbS.okapop191.sbs/PoSt/1122_736098.HtM
BbS.okapop192.sbs/PoSt/1122_302316.HtM
BbS.okapop193.sbs/PoSt/1122_484391.HtM
BbS.okapop194.sbs/PoSt/1122_055481.HtM
BbS.okapop184.sbs/PoSt/1122_472902.HtM
BbS.okapop185.sbs/PoSt/1122_318043.HtM
BbS.okapop186.sbs/PoSt/1122_977487.HtM
BbS.okapop187.sbs/PoSt/1122_991499.HtM
BbS.okapop188.sbs/PoSt/1122_113634.HtM
BbS.okapop190.sbs/PoSt/1122_367827.HtM
BbS.okapop191.sbs/PoSt/1122_769884.HtM
BbS.okapop192.sbs/PoSt/1122_153858.HtM
BbS.okapop193.sbs/PoSt/1122_883947.HtM
BbS.okapop194.sbs/PoSt/1122_425791.HtM
BbS.okapop184.sbs/PoSt/1122_244228.HtM
BbS.okapop185.sbs/PoSt/1122_417572.HtM
BbS.okapop186.sbs/PoSt/1122_016093.HtM
BbS.okapop187.sbs/PoSt/1122_978550.HtM
BbS.okapop188.sbs/PoSt/1122_929639.HtM
BbS.okapop190.sbs/PoSt/1122_036291.HtM
BbS.okapop191.sbs/PoSt/1122_579147.HtM
BbS.okapop192.sbs/PoSt/1122_030060.HtM
BbS.okapop193.sbs/PoSt/1122_578503.HtM
BbS.okapop194.sbs/PoSt/1122_407263.HtM
BbS.okapop184.sbs/PoSt/1122_758700.HtM
BbS.okapop185.sbs/PoSt/1122_329687.HtM
BbS.okapop186.sbs/PoSt/1122_518579.HtM
BbS.okapop187.sbs/PoSt/1122_414751.HtM
BbS.okapop188.sbs/PoSt/1122_793382.HtM
BbS.okapop190.sbs/PoSt/1122_514551.HtM
BbS.okapop191.sbs/PoSt/1122_856474.HtM
BbS.okapop192.sbs/PoSt/1122_928901.HtM
BbS.okapop193.sbs/PoSt/1122_706358.HtM
BbS.okapop194.sbs/PoSt/1122_808018.HtM
BbS.okapop195.sbs/PoSt/1122_258523.HtM
BbS.okapop196.sbs/PoSt/1122_026385.HtM
BbS.okapop197.sbs/PoSt/1122_889218.HtM
BbS.okapop198.sbs/PoSt/1122_342285.HtM
BbS.okapop199.sbs/PoSt/1122_870636.HtM
BbS.okapop200.sbs/PoSt/1122_878017.HtM
BbS.okapop201.sbs/PoSt/1122_188291.HtM
BbS.okapop261.sbs/PoSt/1122_091796.HtM
BbS.okapop287.sbs/PoSt/1122_111699.HtM
BbS.okapop288.sbs/PoSt/1122_359179.HtM
BbS.okapop195.sbs/PoSt/1122_224771.HtM
BbS.okapop196.sbs/PoSt/1122_808489.HtM
BbS.okapop197.sbs/PoSt/1122_265654.HtM
BbS.okapop198.sbs/PoSt/1122_387760.HtM
BbS.okapop199.sbs/PoSt/1122_892779.HtM
BbS.okapop200.sbs/PoSt/1122_926575.HtM
BbS.okapop201.sbs/PoSt/1122_272654.HtM
BbS.okapop261.sbs/PoSt/1122_883154.HtM
BbS.okapop287.sbs/PoSt/1122_789773.HtM
BbS.okapop288.sbs/PoSt/1122_925213.HtM

