在之前我们讨论二分查找的时候,就见识过左右指针的在二分中的用法,拿经典的二分搜索的代码来温习:
def binary_search(nums, target):
left, right = 0, len(nums)-1
# 搜索区间[left,right]
while left <= right:
mid = left + (right - left) //2
if nums[mid] == target:
# 直接返回
return mid
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
return -1
我们再看看在其他方面的应用例题:
167. 两数之和 II - 输入有序数组
这个思路就很类似于二分的写法了,其实也是构建一个f(x)=numbers[left] + numbers[right],如何判断,也是很巧妙的解法:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
left, right = 0, len(numbers)-1
# 解法类似于二分查找
while left <= right:
sum = numbers[left] + numbers[right]
if sum == target:v
return [left+1, right+1]
elif sum < target:
left += 1
else:
right -= 1
return [-1,-1]
此外,左右指针还可以应用到反转数组的题目上去:
344. 反转字符串
思路可以说是很简单了,代码也很简单,找自信吧!
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
if not s:return []
left, right = 0, len(s)-1
while left <= right:
s[left], s[right] = s[right], s[left]
left += 1
right -=1
return s
是不是很简单,双指针里还有一类比较难的滑动窗口问题,下一篇再来看。