LEETCODE 和為s的連續正數數列

2021-10-03 13:50:13 字數 2356 閱讀 7086

輸入乙個正整數 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。現在把問題交給你,你能不能也很快的找出所有和...