LeetCode 1013题一行代码解法原理详解求助
LeetCode 1013题一行代码解法详解
先明确LeetCode 1013题的核心要求:判断给定数组是否能被拆分为三个非空部分,且三个部分的和完全相等。
下面逐段拆解这段一行代码的逻辑:
代码整体结构
import itertools A = [0,2,1,-6,6,-7,9,1,2,0,1] def canThreePartsEqualSum(A): return (lambda x,y: x in y and 2*x in y and 3*x in y)(sum(A)//3,itertools.accumulate(A)) print(canThreePartsEqualSum(A))
这段代码用匿名函数(lambda)封装了判断逻辑,一次性传入两个核心计算结果,直接返回布尔值。
核心参数解析
1. 目标和 x = sum(A)//3
- 先计算数组的总和,再用整数除法除以3,得到每一部分需要达到的目标和
x。 - 如果数组总和无法被3整除,
sum(A)//3 *3会小于原总和,后续3*x in y的判断会直接失败,返回False——这符合题意:总和不能三等分的数组,必然无法拆成三个等和部分。
2. 前缀和序列 y = itertools.accumulate(A)
itertools.accumulate(A)会生成数组的前缀和迭代器:比如数组[a1,a2,a3,...],它会依次返回a1、a1+a2、a1+a2+a3……直到整个数组的总和。
判断条件逻辑
匿名函数的三个判断条件是递进且互补的:
x in y:说明数组中存在某个位置,从开头到该位置的和正好等于x——这意味着我们能划出第一块和为x的非空部分。2*x in y:说明存在某个位置,前缀和等于2x——这意味着从第一块结束的位置到该位置的和也是x(因为2x - x = x),也就是第二块非空部分也符合要求。3*x in y:这个值本质就是数组的总和(如果总和能被3整除,3x = sum(A)),它的作用有两个:一是验证总和确实是x的3倍,二是保证第三块是非空的——因为前面已经找到x和2x的位置,剩下的从2x位置到数组末尾的部分和必然是x,且长度至少为1。
边界情况验证
比如当数组总和为0时(如全0数组),x=0,此时前缀和序列会有多个0,三个条件都会满足,返回True,符合要求:可以拆分成三个非空的全0子数组。
内容的提问来源于stack exchange,提问作者Leee Jeff
相关产品推荐
相关产品推荐

