双指针

1. 283. 移动零

两轮loop。非零元素移到index的位置,index + 1.这样index后的位置就是0的数量

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def moveZeroes(self, nums: list[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
index = 0
for i in range(len(nums)):
if nums[i] != 0:
nums[index] = nums[i]
index += 1
for i in range(index, len(nums)):
nums[i] = 0

2. 11. 盛最多水的容器

双指针贪心,选当前柱子矮的那个-1或+1,注意面积计算时为right-left,不用再+1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def maxArea(self, height: List[int]) -> int:
left = 0
right = len(height)-1
ans = 0
while left < right:
curr = (right - left) * min(height[left], height[right])
ans = max(ans, curr)
if height[left] < height[right]:
left += 1
else:
right -= 1

return ans

3. 15. 三数之和

排序+双指针

这题麻烦的p爆,真是傻逼来的又臭又长的nt题目,我去你吗的重册那娘。言归正传

首先先给数组排序,然后给一个loop固定第一个,左移一位是left,最右为right。符合条件就为答案,然后左右指针移动

第一个点,i这边需要进行一个去重

第二个点,在三数之和为0之后,前后移双指针也需要去冲,做法是left-,right+(发直觉,不过逻辑是需要和前一位比较),然后记得加left < right

第三个点,别忘了用continue而不是pass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution:
def threeSum(self, nums: list[int]) -> list[list[int]]:
ans = []
nums = sorted(nums)
for i in range(len(nums)-2):
#1
if i > 0 and nums[i] == nums[i-1]:
# 3
continue
else:
left = i + 1
right = len(nums) - 1
while left < right:
if nums[left] + nums[i] + nums[right] == 0:
ans.append([nums[left], nums[i], nums[right]])
left += 1
right -= 1
# 2
while left < right and nums[left] == nums[left-1]:
left += 1
while left < right and nums[right] == nums[right+1]:
right -= 1

elif nums[left] + nums[i] + nums[right] > 0:
right -= 1
elif nums[left] + nums[i] + nums[right] < 0:
left += 1
return ans

4. 42. 接雨水

傻逼接雨水,诅咒世界末日你们打捞不到海水过滤器通通接雨水去

每个柱子的水位可以归与左右两边柱子的最小值-当前柱子高度

构建两个数组,leftmax和rightmax,分别对应的就是左边能看到的最高和右边能看到的最高**(记得包括自己)**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def trap(self, height: List[int]) -> int:
n = len(height)
leftmax = [height[0]] * n
rightmax = [height[-1]] * n
for i in range(1, n):
leftmax[i] = max(height[i], leftmax[i-1])
for i in range(n-2, -1, -1):
rightmax[i] = max(height[i], rightmax[i+1])

ans = 0
for i in range(n):
ans += min(leftmax[i], rightmax[i]) - height[i]

return ans

逗你的,其实接雨水就三步走,简单的要死

站内搜索

没有找到内容!