LeetCode最大周长三角形问题:Python解法逻辑疑问
最大周长三角形解法解析
问题背景
我对LeetCode的最大周长三角形问题进行了深入思考,但未能独立写出可行解法。于是找到以下Python解法,想理解其工作原理:
class Solution: def largestPerimeter(self, nums: List[int]) -> int: # triange in-equality a+b > c # sum of 2 smallest > largest nums.sort(reverse=True) a,b,c = inf,inf,inf for n in nums: a, b, c = n, a, b if a + b > c: return a+b+c return 0
我的理解与困惑
数组被降序排序,a、b、c初始化为无穷大。首次循环时,a为数组最大值,b、c仍为无穷大。此时判断“最大值+无穷大>无穷大”是否恒成立?且返回值为最大值+无穷大+无穷大,这怎么会是有效的三角形周长?
解法原理拆解
你完全不用担心首次循环会触发错误返回,Python里的无穷大运算逻辑不会让前两次循环的条件成立,我们一步步捋清楚:
- 排序的意义:把数组降序排列后,我们可以从最大的元素开始尝试组合——只要找到第一组能构成三角形的三个数,它们的周长肯定是最大的,直接返回就行,不用再看更小的数。
- 变量赋值的逻辑:
a,b,c = inf,inf,inf是初始化三个变量为无穷大。每次循环的a, b, c = n, a, b是并行赋值,简单说就是:- 新的
a是当前遍历的数组元素n - 新的
b是上一轮的a - 新的
c是上一轮的b
- 新的
- 循环的执行过程:
- 第一次循环:
n是数组最大值,赋值后a=最大值,b=inf,c=inf。此时a+b=最大值+inf=inf,而c=inf,inf>inf是False,不会触发返回。 - 第二次循环:
n是数组第二大值,赋值后a=第二大值,b=最大值,c=inf。a+b=第二大值+最大值远小于inf,条件依旧不成立。 - 第三次循环:
n是数组第三大值,赋值后a=第三大值,b=第二大值,c=最大值。此时判断的是第三大值+第二大值>最大值——这正是三角形的核心判定条件!因为数组是降序的,c是三个数里最大的,只要较小的两个数之和大于最大数,那这三个数必然能构成三角形(另外两个条件最大值+第二大值>第三大值、最大值+第三大值>第二大值肯定成立,因为前两个数都比第三个数大)。如果条件满足,直接返回三者之和,这就是最大周长。
- 第一次循环:
- 后续循环的作用:如果前三个数不满足条件,就继续检查下一组(比如第四、第三、第二大的数),因为降序排列后,后面的组合周长只会更小,一旦找到符合条件的就返回;遍历完所有元素都没找到的话,返回0。
内容的提问来源于stack exchange,提问作者childoflogos
相关产品推荐
相关产品推荐

