left, right = 0, len(nums) - 1#初始化left,right while left < right: if nums[left] + nums[right] > target: # 收缩right right -= 1 elif nums[left] + nums[right] < target:# 扩张left left += 1 elif nums[left] + nums[right] == target: # 返回结果 return [left, right]
快慢指针 寻找列表中间的项
1 2 3 4 5
fast, slow = 0, 0 while fast < len(nums): slow += 1 fast += 2 return nums(slow)
原地修改问题
原地修改问题一般使用双指针来解决,注意交换的顺序
删除有序数组中的重复项
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defremoveDuplicates(self, nums: List[int]) -> int: # 变动1: 由于元素可以重复2次,left现在从第二个元素开始,right从第三个元素开始 left = 1 for right inrange(2, len(nums)): # 变动2: 以前之和nums[left]比, 现在还要和nums[left - 1]比,从而保证元素可以重复两次 if nums[right] == nums[left] and nums[right] == nums[left - 1]: continue left += 1 nums[left] = nums[right] return left + 1
删除有序数组中的重复项,此时允许有k次重复
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defremoveDuplicates(self, nums: List[int], K: int) -> int: left = K - 1 for right inrange(K, len(nums)): tag = True for i inrange(K): tag *= (nums[right] == nums[left - i]) if tag: continue
left += 1 nums[left] = nums[right] return left + 1