class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
if n == 0:
return
i = j = 0
while j < n:
if nums[j] != 0:
nums[i] = nums[j]
i += 1
j += 1
while i < n:
nums[i] = 0
i += 1
题目描述
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明:你不能倾斜容器。

解题思路
代码
class Solution:
def maxArea(self, height: List[int]) -> int:
n = len(height)
if n == 0:
return 0
l, r = 0, n - 1
res = 0
while l < r:
res = max(res, (r - l) * min(height[l], height[r]))
if height[l] < height[r]:
l += 1
else:
r -= 1
return res
题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
解题思路
代码
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
if n < 3:
return []
nums.sort()
res = []
for i in range(n-2):
if i > 0 and nums[i] == nums[i - 1]:
continue
l, r = i + 1, n - 1
while l < r:
if nums[l] + nums[r] == 0 - nums[i]:
res.append([nums[i], nums[l], nums[r]])
l += 1
r -= 1
while l < r and nums[l] == nums[l - 1]:
l += 1
while l < r and nums[r] == nums[r + 1]:
r -= 1
elif nums[l] + nums[r] > 0 - nums[i]:
r -= 1
else:
l += 1
return res
题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

解题思路
代码
class Solution:
def trap(self, height: List[int]) -> int:
n = len(height)
if n < 3:
return 0
left_max = [0] * n
right_max = [0] * n
for i in range(1, n):
left_max[i] = max(left_max[i - 1], height[i - 1])
for i in range(n - 2, -1, -1):
right_max[i] = max(right_max[i + 1], height[i + 1])
res = 0
for i in range(n):
if min(left_max[i], right_max[i]) > height[i]:
res += min(left_max[i], right_max[i]) - height[i]
return res
双指针在以下场景可以发挥作用:1. 原地对数组进行一些数据交换的操作,比如移动零、翻转数组、旋转数组等操作;2. 排序数组中求两数的目标和,比如三数之和题目;3.序列搜索中,从left = 0和right = n-1分别出发,可通过一定的规律先后移动left和right,最后再O(n)时间内完成搜索。