当前位置: 首页 > 后端技术 > Python

LeetCode面试题57-II.连续正数序列

时间:2023-03-26 15:17:37 Python

和s-sde-lian-xu-zheng-shu-xu-lie-lcof/Title输入一个正整数目标,输出所有连续正整数序列(至少包含两个数)其和是目标。序列中的数字从小到大排列,不同的序列按照第一个数字从小到大排列。示例1:输入:target=9输出:[[2,3,4],[4,5]]示例2:输入:target=15输出:[[1,2,3,4,5],[4,5,6],[7,8]]解题思路:等差级数的求和这里多加一个概念,最后一项和第一项的间隔i。使用区间i,当得到第一项时,可以根据区间得到最后一项。尝试推导公式:算术级数求和公式:$$\frac{(x+y)*(y-x+1)}{2}$$其中y代表最后一项,x代表第一项。现在我们引入区间i的概念,则可以得到$i=y-x$,代入上式:$$\frac{(2x+i)*(i+1)}{2}=target上面$$的公式可以简化为:$$2xi+2x+i^2+i=2*target$$最后,我们可以得到:$$x=\frac{target-\frac{i(i+1)}{2}}{i+1}$$根据上面的公式,可以得到第一项x,这里x必须是正整数,那么$x\geq1$,题中提出即序列至少有两个数,则$i\geq1$,$i+1\geq2$,将$x\geq1,i+1\geq2$带入公式得到约束条件1:$$target-\frac{i(i+1)}{2}\geq2$$同时,因为x必须是正整数,所以上式中:$$\frac{target-\frac{i(i+1)}{2}}{i+1}$$这里得到的结果必须是整数,也就是条件2,具体实现可以通过取模判断。然后根据这两个条件,用代码实现。代码实现类解决方案:deffindContinuousSequence(self,target:int)->List[List[int]]:#i代表区间,res代表返回序列i,res=1,[]#这里是限制条件1whiletarget-i*(i+1)*0.5>=2:#先取模看能不能除mod=(target-i*(i+1)*0.5)%(i+1)#如果可以被整除,则表示除法得到的是一个整数,这里可以求x如果不是mod:x=int((target-i*(i+1)*0.5)/(i+1))#把x和所有从x开始的区间i的数加入序列res.append(list(range(x,x+i+1)))i+=1#因为上面的结果都是从小区间开始搜索的#题中给出的答案是比较区间Returninlargeorder#所以反转returnlistreturnres[::-1]达到效果以上就是的解题过程和实现。涉及到的主要思想也是等差级数求和的数学方法,不过这里引入一个概念,就是首尾两项的区间。当简化问题是获取第一项时,根据区间获取最后一项。欢迎关注微信公众号《书所集录》欢迎关注微信公众号《书所集录》