双指针思想通常用来解决数组或者字符串的子序列问题,
使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
在循环中,判断条件都是右指针所在位置,如果满足,会对右指针位置进行处理,然后放到左指针位置。
leetcode 26 删除有序数组中的重复项
leetcode 674 最长连续递增序列
leetcode 27 移除元素
leetcode 80 删除有序数组中的重复项 II
leetcode 283 移动零
leetcode 75 颜色分类
都可以用上述的思想解决问题。即,确定好已经处理好的部分,和将要处理的部分。
题目内容我就懒得描述了。。网上有很多,只给出答案。
leetcode26 删除有序数组中的重复项
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
class Solution:def removeDuplicates(self, nums: List[int]) -> int:if not nums:return 0n = len(nums)fast,slow = 1,1while fast < n:if nums[fast] != nums[fast - 1]:# 找切换点nums[slow] = nums[fast]slow += 1fast += 1return slow
leetcode 674 最长连续递增序列(的长度)
class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:n=len(nums)curr_len=1max_len=1i,j=0,1while j<n:if nums[j]>nums[i]:curr_len+=1else:curr_len=1max_len=max(curr_len,max_len)i+=1j+=1return max_len
leetcode 27 移除元素
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
class Solution:def removeElement(self, nums: List[int], val: int) -> int:n=len(nums)if n==0:return 0slow,fast=0,0while fast<n:if nums[fast]!=val:nums[slow]=nums[fast] # 抓住核心要求slow+=1fast+=1return slow
leetcode 283 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
class Solution: # 参考leetcode 27 移除元素def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""n=len(nums)i,j=0,0while j<n:if nums[j]!=0:if nums[i]==0:nums[i],nums[j]=nums[j],nums[i] i+=1j+=1return nums
leetcode 80 删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
class Solution: #这个模板适用于每个元素最多出现任意次,只需要修改其中两行代码即可def removeDuplicates(self, nums: List[int]) -> int:n=len(nums)slow,fast=2,2while fast<n :if nums[fast]!=nums[slow-2]: # slow-2,slow-1,slow..fast有超过2个的重复nums[slow]=nums[fast]slow+=1fast+=1return slow
leetcode 75 颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""n=len(nums)i,j=0,0while j<n: #2移动到最右边if nums[j]!=2:if nums[i]==2:nums[i],nums[j]=nums[j],nums[i]i+=1j+=1# print(nums)i,j=n-1,n-1while i>=0: #0移动到最左边if nums[i]!=0:if nums[j]==0:nums[i],nums[j]=nums[j],nums[i]j-=1i-=1return nums