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

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

  • 需要多层循环嵌套时,可以采用双指针法来减少复杂度。
  • 得到链表倒数第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 。如果原来的头被移除了,哑指针也可以指向新的头。所以返回时直接返回哑指针的下一个节点即可。

你可能感兴趣的:(算法)