日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

和为S的连续正数序列(双指针详解)

發布時間:2024/7/23 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 和为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的连续正数序列(双指针详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。