演算法 和為S的連續正數序列 多解)

2021-10-07 06:13:35 字數 1382 閱讀 8155

這個題很經典,我只會兩種做法,然後在網上看了別的大佬的新穎解法(我想不到的0.0),也算作是個學習吧。

題目描述

輸入乙個正數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]]
class

solution

return;}

for(

int i =

1; i < target; i++)}

} vectorint>

>

findcontinuoussequence

(int sum)

};

思路:

設定兩個指標i和j,j再去遍歷陣列後面的數字,看是否能加到sum, j和 j + n分別指向連續正數序列的起始和終止

用s表示當前連續正數序列的和,即s=j+(j+1)+…+j + n <= sum ?

看是否能湊出sum的值。

時間複雜度:o(n*n)

空間複雜度:o(n)

class

solution

if(res == sum) ans.

push_back

(tmp);}

return ans;}}

;

思路:利用連續陣列求和公式,sn = (首項 + 尾項)*項數 / 2 。所以利用雙指標i,j 求的解。

class

solution

else

if( ans < sum)

else

i ++

;//否則i往後移動

}return res;}}

;

思路:

設定兩個指標i和j,分別指向連續正數序列的起始和終止

用s表示當前連續正數序列的和,即s=i+(i+1)+…+js=i+(i+1)+…+j

以i遞增的方式遍歷整個序列(1到n),代表查詢以i開頭的時候結尾j應該是多少。當ssums>sum說明向後走即可。

注意上述遍歷過程中,s=sums=sum的情況下不需要把j往前移動,原因是當進入下乙個迴圈前s−=is−=i,即(i+1)到j的和肯定小於sum。

class

solution

s -= i;

}return res;}}

;

和為S的連續正數序列

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

和為S的連續正數序列

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

和為S的連續正數序列

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