题41(困难):
分析:
这题我开始没什么思路,记录第一个逼我看评论的,后面看评论的方法,真解,借助一个数组,将nums对应数字放对应位置,然后如果下标和数字不同就返回
python代码(基础版):
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
n_list=[-1 for i in range(len(nums))]
#根据提示O(2n)==O(n),我们知道了一定要循环两次,于是就有放回位置上去
for i in range(len(nums)):
if nums[i]>0 and nums[i]<=len(nums):
n_list[nums[i]-1]=nums[i]
for i in range(len(n_list)):
if n_list[i]==-1:
return i+1
return len(nums)+1
python代码(进阶):
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
n_len=len(nums)
#不能用额外空间,那就改变它的值,且时间复杂度为O(n),
#首先使用双指针法,将等于len和小于0的值去了或者放到另一边
left=0
right=len(nums)-1
flag=1
while left<=right:
while left<=right:
if nums[left]>n_len or nums[left]<=0:
break
left+=1
while left<=right:
if nums[right]<=n_len and nums[right]>0:
break
right-=1
if left>right:
break
else:
nums[left],nums[right]=nums[right],-1
#另一边的空间就随便我们使用了,通过left来知道有多少个,将数字根据下标排好
n=0
while n<left:
if nums[n]>n_len or nums[n]<=0:
n+=1
continue
if nums[n]!=n+1:
#如果不相同,则放到相同的地方
if nums[n]!=nums[nums[n]-1]:
#保证换回来的数字不重复,不然就卡住了,顺便排除相同的
tmp=nums[n]
nums[n]=nums[nums[n]-1]
nums[tmp-1]=tmp
n-=1
n+=1
#遍历找相同的
for i in range(n_len):
if nums[i]!=i+1:
return i+1
return n_len+1
题42(困难):
分析:
我一开始是数格子,从最后一行数,但是超时了,只能寻找其他方法,然后想到双指针法,我们可以移动更小的一遍,因为这样对整体才有影响嘛,之前求最大盛水量也是这样,
#双指针,先找左右局部极大值 #移动更小的指针, #如果移动遇到小于其高度的点,面积加上h_left_max-h_left #如果大于,则h_left_max=h_left,a再和右比较,
python代码:
class Solution:
def trap(self, height: List[int]) -> int:
#双指针,先找左右局部极大值
w_res=0
left=0
right=len(height)-1
#左右找峰值
n=0
while left<right:
if height[left]<height[left+1]:
left+=1
else:
break
while left<right:
if height[right]<height[right-1]:
right-=1
else:
break
h_left_max=height[left]
h_right_max=height[right]
#移动更小的指针,
#如果移动遇到小于其高度的点,面积加上h_left_max-h_left
#如果大于,则h_left_max=h_left,a再和右比较,
while left<right:
if height[left]<height[right]:
while left<right:
left+=1
if h_left_max<height[left]:
h_left_max=height[left]
break
w_res+=(h_left_max-height[left])
else:
while left<right:
right-=1
if h_right_max<height[right]:
h_right_max=height[right]
break
w_res+=(h_right_max-height[right])
return w_res
题43(中等):
明天