为何我对这道Codewars编程题的逻辑理解有误?
问题分析与解决
题目明确要求
编写函数
largest_difference,接收数字数组data,返回满足data[i] <= data[j] 且 i < j的最大索引差j - i。注意:不得对数组排序、修改元素顺序或值。
示例:输入[1,2,3]返回2,对应i=0、j=2,2-0=2。
测试用例误解说明
测试用例[9,4,1,2,3,0,-1,-2]的预期答案是2,原因如下:
题目要求的是i在j前面(i < j)且data[i] <= data[j],你想的9(i=0)和-2(j=7)中,data[i]=9 > data[j]=-2,不符合data[i] <= data[j]的条件,所以这对不算。
符合条件的最远索引差是2:比如i=2(data[i]=1)、j=4(data[j]=3),4-2=2,这是满足条件的最大差值。
你的错误代码
def largest_difference(data: list[int]): differences_list: list[int] = [] left_index: int = 0 right_index: int = 0 pointer_index: int = len(data) - 1 def move_index_left(data: list[int], pointer_index: int, left_index: int, differences_list: list[int]): left_index = pointer_index - 1 while(True): if left_index == -1: break if data[left_index] < data[pointer_index]: differences_list.append(abs(pointer_index - left_index)) left_index -= 1 return differences_list def move_index_right(data: list[int], pointer_index: int, right_index: int, differences_list: list[int]): right_index = pointer_index + 1 while(True): if right_index == len(data): break if data[right_index] < data[pointer_index]: differences_list.append(abs(pointer_index - right_index)) right_index += 1 return differences_list while(True): if pointer_index == -1: break if pointer_index == len(data) - 1: differences_list = move_index_left(data, pointer_index, left_index, differences_list) pointer_index -= 1 elif pointer_index == 0: differences_list = move_index_right(data, pointer_index, right_index, differences_list) pointer_index -= 1 else: differences_list = move_index_left(data, pointer_index, left_index, differences_list) differences_list = move_index_right(data, pointer_index, right_index, differences_list) pointer_index -= 1 return max(differences_list)
代码问题点
- 逻辑错误:
move_index_right中加入了data[right_index] < data[pointer_index]的差值,这对应的是data[i] > data[j](i是pointer,j是right_index),完全不符合题目要求的data[i] <= data[j]条件,这部分差值不该被统计。 - 漏判场景:题目要求判断
data[i] <= data[j],但代码只处理了data[i] < data[j]的情况,忽略了相等的场景。
正确解法
直观解法(O(n²)时间,适合小规模数组)
遍历所有i<j的组合,统计满足data[i] <= data[j]的最大索引差:
def largest_difference(data: list[int]) -> int: max_diff = 0 n = len(data) for i in range(n): for j in range(i, n): if data[i] <= data[j]: current_diff = j - i if current_diff > max_diff: max_diff = current_diff return max_diff
优化解法(O(n)时间,O(n)空间)
通过预处理前缀最小值数组,减少重复比较,提升效率:
def largest_difference(data: list[int]) -> int: n = len(data) if n <= 1: return 0 # 前缀最小值数组:min_left[i]表示data[0..i]中的最小值 min_left = [0] * n min_left[0] = data[0] for i in range(1, n): min_left[i] = min(min_left[i-1], data[i]) max_diff = 0 # 从后往前遍历每个j,找最左边的i使得min_left[i] <= data[j] for j in range(n-1, -1, -1): i = 0 while i <= j: if min_left[i] <= data[j]: max_diff = max(max_diff, j - i) break # 找到最左i就停止,保证j-i最大 i += 1 return max_diff
内容的提问来源于stack exchange,提问作者Avery
相关产品推荐
相关产品推荐

