盛最多水的容器
双指针,通过指针大小控制循环;更小的高参与迭代。
python
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height) - 1
max_area = 0
while left < right:
high = min(height[left], height[right])
width = right - left
current_area = high * width
max_area = max(current_area, max_area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
三数之和
循环,i作为一个指针;循环内双指针,左右分别剪枝/去重;通过三数之和的大小决定双指针移动方向
python
class Solution:
def threeSum(self, nums: list[int]) -> list[list[int]]:
n = len(nums)
res = []
if n < 3:
return res
nums.sort()
for i in range(n):
if nums[i] > 0:
break
if i > 0 and nums[i] == nums[i - 1]:
continue
left = i + 1
right = n - 1
while left < right:
sum_three = nums[i] + nums[left] + nums[right]
if sum_three == 0:
res.append([nums[i], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
elif sum_three < 0:
left += 1
else:
right -= 1
return res
接雨水
每次只做一步动作,接水和移动指针错开,左右也错开。移动的下一步要是比当前大,就更新大小,若比当前小,二者差值就是雨水数量。
python
class Solution:
def trap(self, height: List[int]) -> int:
n = len(height)
if n < 3:
return 0
left = 0
right = n - 1
left_max = 0
right_max = 0
total_water = 0
while left < right:
if height[left] < height[right]:
if height[left] >= left_max:
left_max = height[left]
else:
total_water += left_max - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
total_water += right_max - height[right]
right -= 1
return total_water
无重复字符的最长子串
哈希+滑动窗口,用s的序号当作右指针并参与循环。
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
hash_map = {}
max_length = 0
left = 0
for right, char in enumerate(s):
if char in hash_map and hash_map[char] >= left:
left = hash_map[char] + 1
hash_map[char] = right
current_length = right - left + 1
max_length = max(current_length, max_length)
return max_length