如何优化出现超时、运行时错误的Humpy跳跃最大异或值计算Python代码
原代码问题分析
- 逻辑完全错误:未正确理解题意。题目要求的是跳跃路径上所有停留建筑高度的异或值,而非两个高度的异或值,原代码完全没有计算多步跳跃的异或结果,无法得到正确答案。
- 运行时错误:当去重后的高度列表长度小于2时,双重循环不会给
Max列表添加任何元素,执行max(Max)时会触发空序列取最大值的报错。 - 时间复杂度过高:双重循环的时间复杂度为O(m²)(m为去重后高度数量),当数据规模较大时必然触发超时。
正确解法思路
- 预处理每个位置的下一个更大元素下标:使用单调栈可以在O(n)时间复杂度内得到每个位置往后第一个比当前元素大的位置,这是Humpy跳跃的下一个落点。
- 动态规划计算每个起点的异或值:从后往前遍历数组,
dp[i]代表从第i个建筑出发的总消耗。如果i没有下一个更大元素,dp[i] = arr[i];否则dp[i] = arr[i] ^ dp[next_greater[i]],遍历过程中记录最大值即可。
优化后代码
def get_next_greater(arr): n = len(arr) res = [-1] * n stack = [] for i in range(n-1, -1, -1): while stack and arr[stack[-1]] <= arr[i]: stack.pop() if stack: res[i] = stack[-1] stack.append(i) return res n = int(input()) arr = list(map(int, input().split())) next_greater = get_next_greater(arr) dp = [0] * n max_consumption = 0 for i in range(n-1, -1, -1): if next_greater[i] == -1: dp[i] = arr[i] else: dp[i] = arr[i] ^ dp[next_greater[i]] if dp[i] > max_consumption: max_consumption = dp[i] print(max_consumption)
该解法时间复杂度为O(n),空间复杂度为O(n),可以覆盖所有边界情况,不会出现超时和运行时错误。
内容的提问来源于stack exchange,提问作者root
相关产品推荐
相关产品推荐

