力扣算法题:最佳直线(优化) 之前已经分享了如何使用暴力三层循环的方式求解这个帖子我会分享算法的优化方式。之前的解法可以看这个帖子力扣算法题最佳直线算法小白每日一题步骤1先前的解法是枚举出每一条直线再判断剩余点是否在该直线上核心判断依据为斜率。我们可以换一种思路既然循环2和循环3都是计算斜率为什么不把两个循环合并成一个循环把枚举直线转化为枚举斜率只要是同一个斜率那么就必然在同一条直线上。步骤2通过步骤1我们已经把问题转化为了斜率的枚举这样只需要两层循环即可外层循环遍历起始点内层循环遍历剩余点获取斜率我们可以使用一个字典来储存斜率字典的key为斜率value为该直线含有的所有点的编号。具体实现def best_line_improved(points: List[List[int]]) - List[int]: def my_gcd(a, b): # 利用辗转相除法求最大公约数 while b ! 0: a, b b, a % b return a max_count 2 result [0, 1] for i in range(len(points) - 1): # 取起始点 # 剪枝处理 # 如果当前已找到的最多点数已经大于等于剩余的点数则不需要继续遍历了因为剩余的点已经无法找到更优的直线。 if max_count len(points) - i: break slope defaultdict(list) # 斜率[点集] for j in range(i 1, len(points)): # 取剩余点 delta_x points[j][0] - points[i][0] delta_y points[j][1] - points[i][1] if delta_x 0: # 斜率不存在 key (1, 0) elif delta_y 0: # 斜率为0 key (0, 1) else: gcd my_gcd(abs(delta_x), abs(delta_y)) # 求最大公约数 delta_x delta_x / gcd delta_y delta_y / gcd if delta_x 0: # 统一符号 delta_x, delta_y -delta_x, -delta_y key (delta_y, delta_x) slope[key].append(j) # 给斜率中添加编号 for key, value in slope.items(): current_count 1 len(value) # 比较长度 if current_count max_count: # 只有大于才需要替换 max_count current_count result [i, value[0]] return result关注我从零开始的算法小白之路。