第四十一题
第四十一题是寻找给定未排序数组缺失的第一个正数,按照题目的要求无法用额外的空间,因此需要采用原地哈希表的思想或者说用原地置换的思想。对于长度为n的数组,最小缺失的整数只可能在1~n+1之间,因此如果1~n都在数组中,缺失的最小整数就是n+1,否则就是1~n中的某个数。在原先给定的数组中可以对元素进行位置置换实现本题目标,将1~n范围内的数x置换到x-1的位置,因为对于数组来说其下标是从0开始的,举例来说就是将2放到数组中下标为1的位置,也就是数组中的第二个数。在这样一轮置换之后,再次遍历数组,第一个数字与下标不存在上述映射关系的位置,就是缺失的第一个正数的位置,而相应的缺失正数就是该下标+1的数字。
class Solution:
def firstMissingPositive(self, nums: list[int]) -> int:
n = len(nums)
# 1. 将每个正整数放到对应的位置(nums[i]放到nums[nums[i]-1])
for i in range(n):
while 1 <= nums[i] <= n and nums[nums[i]-1] != nums[i]:
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
# 2. 找第一个不满足 nums[i] == i+1 的位置
for i in range(n):
if nums[i] != i + 1:
return i + 1
# 3. 如果都满足,返回 n+1
return n + 1
第四十二题
第四十二题是将给定数组作为柱子的高度,对于这些柱子能够接住的雨水单位进行计算。就像用不同长度木板组成的木桶接水一样,能够接到多少水取决于最短的木板长度。对于这些柱子能够接住多少雨水取决于其两边柱子高度的最小值。因此可以使用两个指针分别指示左右两边柱子的高度,并且需要两个变量分别记录两边柱子高度的最大值。在最开始需要将两边的高度进行对比,找到较小高度的那边,比如说左边的高度较小,则需要移动左边的指针,如果移动后指针指向位置的柱子高度小于左边高度的最大值,说明此时指针指向位置能够接住雨水,且接住雨水的单位为左边最大高度减去当前位置柱子的高度值;如果移动后指针指向位置的柱子高度大于左边高度的最大值,说明此时指针指向位置无法接住雨水,此时需要更新左边柱子的最大高度为当前指针所指向位置柱子高度,之后继续移动左边指针,循环比较两边指针指向位置的柱子高度。如果是右边的柱子高度小则需要移动右边指针,数值计算思想与左边相同。当左右指针相遇时则结束循环,输出最终结果。故得到如下代码:
class Solution:
def trap(self, height: list[int]) -> int:
if not height:
return 0
left, right = 0, len(height) - 1
left_max, right_max = 0, 0
res = 0
while left < right:
if height[left] < height[right]:
if height[left] >= left_max:
left_max = height[left]
else:
res += left_max - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
res += right_max - height[right]
right -= 1
return res
&spm=1001.2101.3001.5002&articleId=148714457&d=1&t=3&u=17d8b00b0b164724812968421a36d125)
699

被折叠的 条评论
为什么被折叠?



