和为S的连续正数序列(双指针详解)
生活随笔
收集整理的這篇文章主要介紹了
和为S的连续正数序列(双指针详解)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目解析:
??題目是小明算數(shù),這里不贅述!->題目鏈接<-
??看到這道題目的可以馬上想到等差數(shù)列,這個(gè)題目可以換一種說(shuō)法就是求有多少個(gè)等差數(shù)列的和為sum,可以直接用公式計(jì)算,但是公式計(jì)算個(gè)人感覺(jué)有一些復(fù)雜,覺(jué)得使用雙指針更好一些,類(lèi)似于TCP中的滑動(dòng)窗口,根據(jù)窗口中的數(shù)值的和來(lái)確定窗口的位置和寬度,大了就向右縮小窗口,小了就向右擴(kuò)大窗口,相等了就向右縮小一個(gè)位置,繼續(xù)之前的比較。當(dāng)窗口縮小到?jīng)]有了,說(shuō)明窗口之后的等差數(shù)列的和都是大于sum的,就可以結(jié)束查找了。
圖解思路:
代碼解析:
??說(shuō)了這么多,大概代碼也已經(jīng)想出來(lái)了!
class Solution { public:vector<vector<int> > FindContinuousSequence(int sum) {//存放返回值vector<vector<int> >ret;int pRight = 2, pLeft = 1;while(pRight > pLeft){//計(jì)算窗口中數(shù)值的和int tmp = (pRight + pLeft)*(pRight-pLeft+1)/2;//如果窗口中的和比sum小,窗口向右擴(kuò)大if(tmp < sum)pRight++;//如果窗口中的和比sum大,窗口向左縮小else if(tmp > sum)pLeft++;//否則窗口中的和與sum一樣大,將窗口中的值保存到ret中else{vector<int> arr;for (int i = pLeft; i <= pRight; ++i){arr.push_back(i);}ret.push_back(arr);//這里強(qiáng)調(diào)要移動(dòng)窗口的左邊框,不能是窗口的右邊框//因?yàn)橛疫叺闹递^大,移動(dòng)有邊框可能會(huì)跳過(guò)一個(gè)符合條件的等差數(shù)列pLeft++;}}return ret;} };總結(jié)
以上是生活随笔為你收集整理的和为S的连续正数序列(双指针详解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何自学web安全(详细路径)
- 下一篇: dsniff 和 Ettercap 和