LeetCode 题集:两指针法
Posted 星海浮生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 题集:两指针法相关的知识,希望对你有一定的参考价值。
本文介绍 LeetCode 题集中,有关两指针法的问题。
167. Two Sum II - Input Array Is Sorted(两数之和 II - 输入有序数组)
问题描述
思路与代码
所谓两指针法,即在有序数组的头尾各置一指针,头指针向后、尾指针向前遍历,寻找符合要求的数对,直到两个指针相遇为止。
代码如下:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i, j = 0, len(numbers) - 1
while i < j:
if numbers[i] + numbers[j] == target:
return [i + 1, j + 1]
elif numbers[i] + numbers[j] < target:
i += 1
else:
j -= 1
return []
运行效果:
15. 3Sum(三数之和)
问题描述
思路与代码
本题为前一题的变体,只需在两指针法外面嵌套一层循环即可。
代码如下:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums_ = sorted(nums)
result = []
# loop 1: 三数之和
for i in range(len(nums_) - 2):
# 和的最小值大于目标
if nums_[i] + nums_[i + 1] + nums_[i + 2] > 0:
break
# 和的最大值小于目标
if nums_[i] + nums_[len(nums_) - 2] + nums_[len(nums_) - 1] < 0:
continue
# 答案中同一位置的数字不能相同
if i and nums_[i] == nums_[i - 1]:
continue
# loop 2: 两数之和
target = 0 - nums_[i]
j, k = i + 1, len(nums_) - 1
while j < k:
if nums_[j] + nums_[k] == target:
result.append([nums_[i], nums_[j], nums_[k]])
j += 1
while j < k and nums_[j] == nums_[j - 1]:
j += 1
elif nums_[j] + nums_[k] < target:
j += 1
else:
k -= 1
return result
运行效果:
18. 4Sum(四数之和)
问题描述
思路与代码
本题与前一题相似,也是两数之和的变体,只需在两指针法外面嵌套两层循环即可。
代码如下:
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums_ = sorted(nums)
result = []
# loop 1: 四数之和
for i in range(len(nums_) - 3):
# 和的最小值大于目标,下同
if nums_[i] + nums_[i + 1] + nums_[i + 2] + nums_[i + 3] > target:
break
# 和的最大值小于目标,下同
if nums_[i] + nums_[len(nums_) - 3] + nums_[len(nums_) - 2] + nums_[len(nums_) - 1] < target:
continue
# 答案中同一位置的数字不能相同,下同
if i and nums_[i] == nums_[i - 1]:
continue
# loop 2: 三数之和
target_3 = target - nums_[i]
for j in range(i + 1, len(nums_) - 2):
if nums_[j] + nums_[j + 1] + nums_[j + 2] > target_3:
break
if nums_[j] + nums_[len(nums_) - 2] + nums_[len(nums_) - 1] < target_3:
continue
if j > i + 1 and nums_[j] == nums_[j - 1]:
continue
# loop 3: 两数之和(两指针法)
target_2 = target_3 - nums_[j]
x, y = j + 1, len(nums_) - 1
while x < y:
if nums_[x] + nums_[y] == target_2:
result.append([nums_[i], nums_[j], nums_[x], nums_[y]])
x += 1
while x < y and nums_[x] == nums_[x - 1]:
x += 1
elif nums_[x] + nums_[y] < target_2:
x += 1
else:
y -= 1
return result
运行效果:
344. Reverse String(反转字符串)
问题描述
思路与代码
本题的思路,参考两指针法,对头尾指针的数字进行调换,然后逐渐向中间逼近,直到相遇为止。
代码如下:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
i, j = 0, len(s) - 1
while i < j:
s[i], tmp = s[j], s[i]
s[j] = tmp
i += 1
j -= 1
运行效果:
以上是关于LeetCode 题集:两指针法的主要内容,如果未能解决你的问题,请参考以下文章