双指针法去除重复数字整理

之前做题时也遇到过双指针解法,比如:

  • 需要多层循环嵌套时,可以采用双指针法来减少复杂度。
  • 得到链表倒数第n个元素时,可以使用快慢指针优化算法,只要快指针比慢指针快n就可以。

最近做了几道去除数组或链表中重复数字的题目,包括去掉所有重复数字,每个重复数字保留一个,每个重复数字保留两个等等。
LeetCode26: Remove Duplicates from Sorted Array
LeetCode27: Remove Element
LeetCode80: Remove Duplicates from Sorted Array II
LeetCode82: Remove Duplicates from Sorted List II
LeetCode83: Remove Duplicates from Sorted List

这些题目都可以使用双指针法解决。
使用两个指针 left 和 right,其中 left 是慢指针,而 right是快指针。只要 nums[left] = nums[right],就增加 right 以跳过重复项。
当nums[left]!=nums[right],就根据题目要求将后面的数复制到慢指针指向的中。

当题目不要求返回的数组中的数的顺序时,也可以使用头尾指针,如果数有重复时,直接将头指针与尾指针交换即可。例如:Remove Element

另外,当链表的头可能发生改变,而又要返回链表的头时,可以设置一个哑指针。例如: Remove Duplicates from Sorted List II 。如果原来的头被移除了,哑指针也可以指向新的头。所以返回时直接返回哑指针的下一个节点即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值