滴滴笔试(求第一题实现逻辑)

# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# 检验二者长度是否相等
if not pushV or len(pushV)!=len(popV):
return False
stack = []
for i in pushV:
stack.append(i)
while len(stack) and stack[-1] == popV[0]:
stack.pop()
popV.pop(0)
#验证最终栈中所有元素都清空
if len(stack):
return False
return True
#滴滴#
全部评论
魔法权杖强化 题目描述:  有一把魔法权杖,权杖上有n颗并排的法术石(编号为1到n)。每颗法术石具有一个能量值,权杖的法术强度等同于法术石的最小能量值。权杖可以强化,一次强化可以将两颗相邻的法术石融合为一颗,融合后的能量值为这两颗法术石能量值之和。现在有m次强化的机会,请问权杖能强化到的最大法术强度是多少? 输入 第一行包含两个正整数n,m,表示n颗法术石,m次强化机会。 第二行为n个用空格隔开的正整数v1, v2, … ,vn,vi表示编号为i的法术石具有的能量值。 数据范围:1≤m<n≤100000,1≤vi≤100000 输出 输出1个整数,表示权杖的最大的法术强度。 样例输入 6 31 7 2 2 5 9样例输出8 Hint样例说明:合并1、7得到 { 8 2 2 5 9 },合并2、2得到 { 8 4 5 9 },合并4、5得到 { 8 9 9 },法术强度等于8。 错误解法 自以为是暴力,只AC 27% n, m = list(map(int, input().split())) # 6 3 arr = list(map(int, input().split())) # [1,7,2,2,5,9] for _ in range(m): idx = arr.index(min(arr)) if idx == len(arr)-1 or idx > 0 and arr[idx+1] > arr[idx-1]: arr = arr[:idx-1] + [arr[idx-1] + arr[idx]] + arr[idx+1:] else: arr = arr[:idx] + [arr[idx] + arr[idx+1]] + arr[idx+2:] print(min(arr)) 分析错误1 - TLE错误2 - 考虑情况比如 3 2 1 4 code合并两次:3 3 4 → 6 4 → 取4 而正确方法为:5 1 4 → 5 5 → 5 正确解法 思路 from 群里某大佬 这个题变形一下: 假设我们知道最后的能量值是p的情况下 我们要判断这个序列能否在生成最小能量值为p,并且合并次数不大于m? 解决方法 1)从左往右扫,如果碰到能量值小于p的,向右合并即可,直到能量值大于或等于p 2)然后判断合并次数是不是不大于m 然后能量值p的取值范围肯定是在数组中,只需要把数组排个序,二分 伪代码 能量值的取值范围:1到所有数相加 1)直接二分1到所有数相加,取中间p2)判断helper(p)是否大于或等于m3)如果是,可以让能量值再大一些,p继续往大的二分;如果不是,往小的二分,直到得出p 时间复杂度是o(nlogk),k是最大和n*100000 代码 只保证测试用例和思路对,不知道能不能AC # 从左往右扫,如果碰到能量值小于p的,向右合并即可,直到能量值大于或等于p def helper(arr, target): cnt = 0 cur = 0 for num in arr: cur += num if cur < target: # 需要合并 cnt += 1 else: cur = 0 return cnt n, m = list(map(int, input().split())) # 6 3 arr = list(map(int, input().split())) # [1,7,2,2,5,9] left = min(arr) right = sum(arr) + 1 # 如果不加1, mid会取不到sum(arr) while left+1 < right: mid = (left + right) // 2 if helper(arr, mid) <= m: # 满足要求, 可以让能量值再大一些 left = mid else: right = mid print(left)
点赞 回复 分享
发布于 2018-10-10 22:51
偶,多谢,我想了好久了
点赞 回复 分享
发布于 2018-10-12 10:12
2与5,3与4合并不是两次吗?
点赞 回复 分享
发布于 2018-10-12 10:02
如2,3,4,5,7按上面的代码,调用helper(arr,7)。那么返回值是3,也就是需要合并3次才能使最小值>=7,而实际上是2次就行。
点赞 回复 分享
发布于 2018-10-11 15:36
https://blog.csdn.net/a786150017/article/details/83004490
点赞 回复 分享
发布于 2018-10-10 22:31

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务