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

劍指Offer 和為S的連續正數序列

題目:

輸入一個正數s,打印出所有和為s的連續正數序列(至少含有兩個數)。例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果打印出3個連續序列1~5、4~6和7~8。
樣例
輸入:15
輸出:[[1,2,3,4,5],[4,5,6],[7,8]]

解答:

數學公式法:由於是等差數列,假設數列第一個和最後一個數字分別為i和j,則有方程 (i + j)/2 * (j - i + 1) = sum(等式1),可求得 j * (j + 1) = 2* sum + i ^ 2 - i (等式2)。對於每個 i,判斷是否存在整數 j符合等式2,若存在則有數列 [i, …, j]的和為sum。由於實際上只需要判斷 sum/2 個 i,所以時間複雜度為 O(n)。

class Solution(object):
    def findContinuousSequence(self, sum):
        """
        :type sum: int
        :rtype: List[List[int]]
        """
        rlist = []
        for i in range(1, int(sum/2) + 1):
            right = 2*sum + i**2 - i
            if right >= 0:
                j = int(
right**(1/2)) if j * (j + 1) == right: rlist.append([k for k in range(i, j + 1)]) return rlist

雙指標法:參考劍指Offer,時間複雜度也是O(n)

class Solution(object):
    def findContinuousSequence(self, sum):
        """
        :type sum: int
        :rtype: List[List[int]]
        """
small, big = 1, 2 rlist = [] s = small + big while(big <= int(sum/2) + 1): if s == sum: rlist.append([i for i in range(small, big + 1)]) s += big + 1 big += 1 else: if s > sum: s -= small small += 1 else: s += big + 1 big += 1 return rlist