第一题:求山峰面积
求解山峰面积问题,给定一个数组,每个元素值非负,表示山峰的高度,0表示平地。所有相互连接(上下左右)的凸起的高地构成山脉,求最大的山脉面积(一个元素的底面积为1)。
比较简单,其实就是求最大岛屿的问题,只是这里不再是进行加一操作,而是加上当前元素值。
第二题:外卖员到达指定楼层最短时间
外卖员当前处在第N层,需要到达第M层,他每分钟可以选择走楼梯,上一层或者下一层,或者坐电梯到达第2*N层。楼层总共L(< =10 ^ 5)层。
输入:
一行包含两个数字N,M
输出:
最短的时间
采用动态规划方法,dp[i]:从第N层到达第i层所需要的最短时间。
当时通过率为88%,后来发现代码在向下更新的时候,后面的dp[i](i % 2 == 0)没有利用最优的dp[i // 2]进行更新。因此还需要进行一个偶数位的数值更新。
N, M = map(int, input().split())
def funer():
dp = [float('inf')] * 100005
dp[N] = 0
for i in range(N - 1, -1, -1):
dp[i] = dp[i + 1] + 1
dp[0] -= 1
if N >= M:
return dp[M]
# 先只考虑向上
for i in range(N+1, 100000):
if i == 100000:
dp[i] = min(dp[i - 1], dp[i // 2]) + 1
else:
if i % 2 != 0:
dp[i] = dp[i - 1] + 1
else:
dp[i] = min(dp[i - 1], dp[i // 2]) + 1
# 再考虑向下
for i in range(100000, N - 1, -1):
dp[i] = min(dp[i], dp[i + 1] + 1)
# 偶数位更新
for i in range(2, 100000, 2):
dp[i] = min(min(dp[i - 1], dp[i + 1], dp[i // 2]) + 1, dp[i])
return dp[M]
res = funer()
print(res)
参考牛客上某位大佬的,看评论说是ac了!
N, M = map(int, input().strip().split(' '))
if M <= N :
print(N - M)
else:
dp = [0] * (M + 1)
for i in range(1, N):
dp[i] = N - i
for i in range(N + 1, M + 1):
down = 1 + dp[i - 1]
if i % 2 == 0:
el = dp[i // 2] + 1
else:
el = 2 + dp[(i + 1)//2]
dp[i] = min(down, el)
print(dp[M])
另外附上BFS求解的代码:
from collections import deque
N, M = map(int, input().strip().split(' '))
def funer():
visited = [False] * (M + 1)
visited[N] = True
q = deque([N])
ans = 1
while q:
for _ in range(len(q)):
cur = q.popleft()
a, b, c = cur - 1, cur + 1, 2 * cur
if a == M or b == M or c == M:
return ans
if 0 < a <= M and not visited[a]:
q.append(a)
visited[a] = True
if 0 < b <= M and not visited[b]:
q.append(b)
visited[b] = True
if 0 < c <= M and not visited[c]:
q.append(c)
visited[c] = True
ans += 1
return -1
if M <= N:
print(N - M)
else:
res = funer()
print(res)
第三题:求最大的相同子树
给定一颗二叉树,找到完全相同的两颗子树(子树层数大于等于2),如果存在多个,则返回最大的子树,如果不存在则输出-1.
输入:
一个数组,表示一颗二叉树,数组元素按层序排序,不存在节点用null表示,每个节点的值在[0,10]之间,不包含0和10,二叉树层数小于5.
[1,2,3,1,null,2,null,null,null,null,nul,1,null,null,null]
输出:
完全相同的子二叉树的数组,子树可以位于不同的层次。
[2,1,null]
与lc652有点类似。