輸入乙個正整數 target ,輸出所有和為 target 的連續正整數序列(至少含有兩個數)。
序列內的數字由小到大排列,不同序列按照首個數字從小到大排列。
示例 1:
輸入:target = 9
輸出:[[2,3,4],[4,5]]
示例 2:
輸入:target = 15
輸出:[[1,2,3,4,5],[4,5,6],[7,8]]
最容易想到的就是暴力遍曆法,乙個個遍歷陣列,將符合要求的數字新增,直到滿足條件 ,陣列之和等於target
def findcontinioussequence(target):
"""暴力遍曆法
:param target:
:return:
"""ans =
for i in range(1, target - 1):
sum_array =
now_num = i
while sum(sum_array) < target and now_num < target:
now_num += 1
if sum(sum_array) > target:
break
elif sum(sum_array) == target:
break
return ans
好處:理解容易,思路容易想到
壞處:時間複雜度很大,速度是最慢的
利用雙指標形成乙個視窗
當視窗內總和小於target,就擴張視窗,即向右移動右指標
當視窗內總和大於target,就縮小視窗,就向右移動左指標
def findcontinioussequencev2(target):
"""雙指標視窗法
:param target:
:return:
"""i = 1
j = 2
ans =
while j <= target // 2 + 1:
cur_sum = sum(list(range(i, j+1)))
if cur_sum < target:
# 小於target,擴張視窗,右指標往右
j += 1
elif cur_sum > target:
# 大於target,縮小視窗,左指標往右
i += 1
else:
# 這裡改i改j都行
j += 1
return ans
我們知道等差數列求和是有個通項公式的。
以此為基礎我們逐個遍歷滿足該公式的元素
def findcontinioussequencev3(target):
# 求根公式遍曆法
"""設首項為x,尾項為y
target = (x+y)*(y-x+1)*0.5
這裡把y當常數
反解出x = (y^2 + y - 2*t + 0.25)^(0.5) + 0.5
遍歷:param target:
:return:
"""ans =
for y in range(1, target // 2+2):
x = (y*y + y - 2*target + 0.25)**(1/2) + 0.5
print(x)
if type(x) != complex and x - int(x) == 0:
return ans
這裡解釋一下為什麼範圍是target // 2 + 1
這是個很簡單的想法
比如你target是15
那你肯定只有在0-8的區間去找,因為8 = target / 2
再往後相當於 (target /2) + (target /2 + 1) > target肯定是不滿足條件的
還是利用等差數列的通項公式,定義y-x = i,i被稱為間隔,利用i這個變數消去公式裡的y
相當於是在求和公式基礎上增加了額外的條件,加快整個遍歷過程
def findcontinioussequencev4(target):
""":param target:
:return:
"""i = 1
ans =
while i*(i+1)/2 < target:
if not (target - i*(i+1)/2) % (i+1):
x = int((target - i*(i+1)/2) // (i+1))
i += 1
ans = ans[::-1]
return ans
和為s的連續正序列
題目 輸入乙個正數s,列印出所有和為s的連續正數序列 至少含有兩個數 例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以結果列印出3個連續序列1 5,4 6,7 8。解析 我們考慮兩個數small和big分別表示序列中的最小值和最大值。首先把small初始化為1,big初始化為2....
兩種方法解LeetCode和為s的連續正數序列
題目描述 方法一 數學方法 頭一次自己想的方法不僅能通過,而且效率還挺高,先看一下數學方法的提交結果 其實思路也很簡單 分析題目可知得到的序列為等差數列,那我們只要知道每個序列的起始值以及序列的長度,我們就可以構造出整個序列,然後用乙個臨時的vector儲存此序列,最後將臨時的vector加入二維陣...
和為S的連續
小明很喜歡數學,有一天他在做數學作業時,要求計算出9 16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100 至少包括兩個數 沒多久,他就得到另一組連續正數和為100的序列 18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和...