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

2021-08-28 04:35:40 字數 1534 閱讀 4885

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

輸出所有和為s的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序

這個題目自己寫的很混亂,導致編譯都過不去,有很多數學的方法。這裡我們用的是暴力求解的方法。

class solution 

if ((sum == n) && left != right)

array.push_back(tmp);}}

return array;

}};

最初我寫的想法和這個是一樣的,不過自己的思維混亂了,我想當我們找到一段序列之後,比如我們sum是15,當我找到4,5,6,這個序列之後我下一步應該怎麼做,應該是right變還是讓我們的left邊,如果我讓left--,那我是不是讓right++又等於sum,徹底混亂了。

我們上來讓左右指標都是1,然後開始移動我們的右指標,然後去求一下和n,這裡要注意是n=n+right,千萬不可寫成n=left+right,這求的就不是區間值了,就變成我上邊混亂思想的兩個值相加了,而不是區間。為了保險我們可以每次for或者while迴圈求,但是這裡也沒有必要,因為n是不斷加的。

while (n > sum)

如果說我們當前序列和是大於我們要求的sum的,這時候就應該減小,自然就是讓left++,這裡我最初沒想明白,當時你讓left--,或者right++都是不對的吧,因為這樣反而讓自己的區間更大了,right--也不對,因為這就是你上一層迴圈的情況,這樣會形成乙個死迴圈。只能通過left++讓區間縮小。這時候只要讓我們的n不大於sum就行,可以不等於,但是後來我又仔細一想,如果我現在讓left++移動了,下次我又讓我們的right++了,那我們的區間這不是更大了麼,小的加了乙個1,大的又加了乙個1,區間反而大了更多,這裡要想明白這是乙個while迴圈,還拿數字舉例子,4,5,6,7,8假如我們的sum是21,現在的和是30,我們讓left++,就變成了5,6,7,8,這時候和是26還是要比我們的sum大的,再讓他去減去5,就變成了6,7,8這時候就是21了, 我們可能會減去左邊很多個數字,80,81,82,83,我們減去80,81,加上乙個84區間依然是變小了,這裡要清楚。

if ((sum == n) && left != right)

array.push_back(tmp);

}

所以這裡要判斷,不一定我們的n就符合我們的條件了,可能n和sum不相等。這裡最初我想的是sum這個值怎麼也要進去,但是後來想想也對,人家要的是乙個區間,你如果只有乙個值進去不符合,所以這裡要left不能等於right。如果符合兩個條件,那就開始往陣列中裡邊插入,這裡函式的返回值是乙個二維陣列,所以我們這裡每乙個區間都是乙個一維陣列,然後把每個區間當成乙個元素插入到我們的返回的二維陣列中。真的是感覺這些容器是很強大的了。

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

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

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

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

劍指offer 和為 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...