1. 程式人生 > >劍指offer 41. 和為S的連續正數序列

劍指offer 41. 和為S的連續正數序列

原題

小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!

輸出描述:

輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序

Reference Answer

思路分析

這個其實就是考察等差數列求和,不能直接用DFS求解,時間複雜度太高,經驗證,DFS方法不能通過。

  • 等差數列求和公式: S n = n ( a
    1 + a n ) 2
    S_n = \frac{n(a_1 + a_n)}{2}
    以及 S n = a 1 n + n ( n 1 ) 2 d S_n = a_1 n + \frac{n(n-1)}{2}d

這裡直接使用第一個公式進行求和計算;設定兩個索引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

  • 上述題解的遍歷方式很巧妙,值得注意與借鑑。