劍指offer 41. 和為S的連續正數序列
阿新 • • 發佈:2018-11-25
原題
小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!
輸出描述:
輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序
Reference Answer
思路分析
這個其實就是考察等差數列求和,不能直接用DFS求解,時間複雜度太高,經驗證,DFS方法不能通過。
- 等差數列求和公式: 以及
這裡直接使用第一個公式進行求和計算;設定兩個索引left
, right
,進行從先向後遍歷。
# -*- coding:utf-8 -*-
class Solution:
def FindContinuousSequence(self, tsum):
# write code here
if tsum <= 1:
return []
left, right = 1, 2
res = []
while left < right:
temp_sum = (left + right)*(right - left + 1)/2
if temp_sum < tsum:
right += 1
elif temp_sum == tsum:
res.append(list(range(left, right+1)))
left += 1
elif temp_sum > tsum:
left += 1
return res
Note
- 上述題解的遍歷方式很巧妙,值得注意與借鑑。