leetcode刷题第七天
1.第一题:
这道题使用动态规划,从前到后太复杂了又难理解,从后向前比较容易理解,思路是这样的新建一个辅助数组memo用来标识第i个节点是否可达,先初始化为0,若i可达则令memo[i]为1,不可达则为0,从nums尾部开始向前循环,若nums[i-1]可以到达nums[i],则将memo[i-1]置为1:
代码如下:
class Solution:
def canJump(self, nums: List[int]) -> bool:
length=len(nums)
memo=[0]*length
memo[length-1]=1
for i in range(length-2,-1,-1):
maxjump=min(i+nums[i],length-1)
for j in range(i+1,maxjump+1):
if(memo[j]==1):
memo[i]=1
break
if(memo[0]==1):
return True
else:
return False
害,这道题的代码也是醉了,跑到最后一个例子一直都是超时,无语无语。
2.第二题,题目如下:
解法的搬运工:
将数组中的区间按照起始位置排序
用curr数组记录当前合并的最大区间,遍历数组中的每一个区间,如果当前区间的起始位置小于curr的终点位置,则可以继续合并,所以合并并更新curr的起始和终止位置。如果当前区间的起始位置大于curr的终点位置,则无法合并。所以将curr加入到result里,并用当前的区间替换curr的值。
这道题还挺简单的,代码如下:
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
def take1(elem):
return elem[0]
if len(intervals)<2:
return intervals
intervals.sort(key=take1)#将二维数组进行排序
curr=intervals[0]
result=[]
for i in intervals:
if curr[1]>=i[0]:
curr[1]=max(curr[1],i[1])
else:
result.append(curr)
curr=i
if len(curr)!=0:
result.append(curr)
return result