劍指Offer 和為S的連續正數序列
阿新 • • 發佈:2018-12-10
題目:
輸入一個正數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