求二维数组中极大点的Python程序调试求助
排查极大点程序错误并修正
我来帮你梳理下代码里的问题,然后给出能正确输出极大点的解决方案:
首先看代码里的两个关键错误
- 变量名不匹配:你定义的点列表是
a,但后续排序和遍历的时候却用了mylist,这会直接抛出NameError,Python根本找不到mylist这个变量。 - 逻辑判断混乱:你的核心思路(按x升序排序后从右往左检查y值)是可行的,但while循环的逻辑完全错了。按x升序排序后,右边的点x坐标都比当前点大,所以只要右边存在任意一个点的y坐标≥当前点的y,当前点就会被支配(x更大、y不更小),不属于极大点。你的代码里的循环没有正确判断这个条件,反而错误地累加j直到末尾才打印,导致结果不对。
修正后的代码(保留你的核心思路并优化)
我调整了变量名,同时简化了逻辑——其实不需要逐个比较右边所有点,只需要跟踪遍历过程中遇到的最大y值就可以了,效率更高:
# 原始点坐标列表 points = [[5,7],[47,84],[89,4],[46,54],[100,1]] # 按x轴升序排序 points.sort(key=lambda x: x[0]) max_y = -float('inf') max_points = [] # 从右往左遍历(x从大到小) for point in reversed(points): x, y = point # 只要当前点的y比之前所有右边点的最大y大,就说明它是极大点 # 因为右边的x更大但y更小,左边的x更小,无法支配它 if y > max_y: max_points.append(point) max_y = y # 输出成示例格式 output = ", ".join([f"({x},{y})" for x, y in max_points]) print(output)
如果需要保留点的名称(比如示例里的p2),可以把输入改成包含名称的结构,这样输出就能完全匹配示例:
# 带名称的点列表,空字符串代表没有名称的点 points = [("p1",5,7),("p2",47,84),("p3",89,4),("",46,54),("",100,1)] # 按x坐标升序排序 points.sort(key=lambda x: x[1]) max_y = -float('inf') max_points = [] for name, x, y in reversed(points): if y > max_y: # 根据是否有名称拼接字符串 if name: max_points.append(f"{name}({x},{y})") else: max_points.append(f"({x},{y})") max_y = y # 输出和示例完全一致的结果 print(", ".join(max_points))
运行这段代码会直接输出:p2(47,84), (89,4), (100,1)
逻辑验证(用你的示例输入)
排序后的点列表(按x升序):[[5,7], [46,54], [47,84], [89,4], [100,1]]
从右往左遍历:
- (100,1):当前max_y是负无穷,1更大,加入极大点,max_y更新为1
- (89,4):4>1,加入极大点,max_y更新为4
- (47,84):84>4,加入极大点,max_y更新为84
- (46,54):54<84,被支配,不加入
- (5,7):7<84,被支配,不加入
最终得到的结果完全符合示例要求。
内容的提问来源于stack exchange,提问作者Pritesh Singh
相关产品推荐
相关产品推荐

