HackerRank是否评估代码速度?我的饼干问题解法为何不通过?
饼干甜度混合问题求解疑问
问题描述
Jesse喜欢饼干,希望所有饼干的甜度大于阈值k。为此,需反复混合甜度最低的两块饼干,生成的新饼干甜度为:甜度 = 最不甜的饼干 + 2×第二不甜的饼干。重复此操作直到所有饼干甜度≥k。
给定若干饼干的甜度值,求所需的最少操作次数;若无法达成则返回-1。示例:
最小的两个值被移除,将新值放回数组……最终经过若干次迭代后所有值≥k,返回操作次数。函数说明:完成编辑器中的cookies函数。
cookies参数:
int k:阈值
int A[n]:甜度数组
返回值:
int:所需操作次数或-1
我的Python代码
def cookies(k, A): i = 0 while True: A.sort() print(A) if A[0] >= k: break elif len(A) < 2: i = -1 break n1 = A.pop(0) n2 = A.pop(0) new_cookie = (n1 + 2*n2) A.insert(0, new_cookie) i += 1 return i
疑问与解答
1. HackerRank是否会评估代码速度?
是的,HackerRank的算法题会严格评估代码的时间复杂度,超时的测试用例会直接判定不通过。
2. 我的代码是否不够高效?
你的代码效率存在明显问题,核心原因有两点:
- 每次循环都执行排序:每次
A.sort()的时间复杂度是O(n log n),若需要m次混合操作,整体时间复杂度会达到O(m*n log n),面对大规模输入时必然超时。 - 列表首尾操作效率低:列表的
pop(0)和insert(0)是O(n)复杂度的操作,因为需要移动后续所有元素,进一步放大了性能损耗。
正确的优化方案是使用最小堆(优先队列):Python的heapq模块可以实现最小堆,每次取最小两个元素、合并后放回堆的操作均为O(log n)复杂度,整体时间复杂度为O(n log n + m log n),能高效处理大规模数据。
3. 是否存在排序导致溢出的边界情况?
Python的整数支持任意精度,不会出现整数溢出问题,这一点无需担心。
内容的提问来源于stack exchange,提问作者Tanner Phillips
相关产品推荐
相关产品推荐

