和为S的连续正数序列(双指针详解)
生活随笔
收集整理的這篇文章主要介紹了
和为S的连续正数序列(双指针详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目解析:
??題目是小明算數,這里不贅述!->題目鏈接<-
??看到這道題目的可以馬上想到等差數列,這個題目可以換一種說法就是求有多少個等差數列的和為sum,可以直接用公式計算,但是公式計算個人感覺有一些復雜,覺得使用雙指針更好一些,類似于TCP中的滑動窗口,根據窗口中的數值的和來確定窗口的位置和寬度,大了就向右縮小窗口,小了就向右擴大窗口,相等了就向右縮小一個位置,繼續之前的比較。當窗口縮小到沒有了,說明窗口之后的等差數列的和都是大于sum的,就可以結束查找了。
圖解思路:
代碼解析:
??說了這么多,大概代碼也已經想出來了!
class Solution { public:vector<vector<int> > FindContinuousSequence(int sum) {//存放返回值vector<vector<int> >ret;int pRight = 2, pLeft = 1;while(pRight > pLeft){//計算窗口中數值的和int tmp = (pRight + pLeft)*(pRight-pLeft+1)/2;//如果窗口中的和比sum小,窗口向右擴大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);//這里強調要移動窗口的左邊框,不能是窗口的右邊框//因為右邊的值較大,移動有邊框可能會跳過一個符合條件的等差數列pLeft++;}}return ret;} };總結
以上是生活随笔為你收集整理的和为S的连续正数序列(双指针详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何自学web安全(详细路径)
- 下一篇: python Lambda 表达式