待字閨中之子序列分析

來源:互聯網
上載者:User

標籤:待字閨中   移動   數組   遍曆   

原題

給定長度為n的整數數列:a0,a1,..,an-1,以及整數S。這個數列會有連續的子序列的整數總和大於S的,求這些數列中,最小的長度。

分析

如果只是像題目這樣的描述,沒有強調正數,可以採用O(n^2)的方法。具體代碼如下:

int subSeqWithNegative(vector<int>& data,int sum){int i,j,length = data.size(),res = length+1;for (i = 0;i < length;i++)//尋找每一個以i開始的,滿足條件的最短序列長度{j = i;int curSum = 0;while(j < length){curSum += data[j];if (curSum > sum){if(j - i + 1 < res)res = j - i + 1;break;}j++;}}if(res == length+1)return -1;//找不到大於sum的序列return res;}

但是,很多同學在討論的時候,指出了如果是正數,解法將會有什麼樣的變化。這個很好。不考慮正負的O(n^2)的方法,這裡不詳細說了,我們來討論,當數列中都是正數的情況。

介紹一個利用排序+二分的方法。對於子序列ai...at,子序列和s=ai+...+at=sum[t]-sum[i-1]。sum[t]表示數列a0...at的和。那麼,數組sum天然就是遞增的,可以進行二分尋找。 那麼如何進行二分尋找呢?對於數組sum,遍曆找到第一個k,sum[k]>S,二分尋找k前面的某一個j,j是sum[k]-sum[j]>S裡最大的一個,則k-j是最小的。依次遍曆完數組。 可以得到最小的長度,整體的時間複雜度O(nlogn),空間複雜度為O(n)。 是否有更快的方法呢?從以上兩個方法,我們可以有如下的觀察:

  • a0...at>S,則a0...at+1無需再考慮

  • 對於a0...at>S,只需嘗試a1...at是否>S,如果大於S,則更新最短長度。

  • 如果不大於S,大於S的只可能是a1...atat+1等。

鑒於以上的觀察,我們有如下的演算法:設定索引i,j指向第一個整數:

1. ++j,直到sum[j]-sum[i]>S,這裡不需要額外儲存sum,為了方便說明。記錄子序列長度2. ++i,如果sum[j]-sum[i]>S,更新最小子序列長度。直到sum[j]-sum[i]<=S。3. ++j,直到sum[j]-sum[i]>S。重複上面的兩步,直到數組遍曆完畢。

整個演算法的時間複雜度為O(n)。下面我們做一個樣本數組為{5,1,3,5,10,7,4,9,2,8},S=10,i=j=0開始

1. 當j=3時,和為14>10,則更新最小長度為42. 對i進行遞增操作,和為9<10,不滿足條件。對j進行遞增3. 當i=1,j=4時,和為19>10,長度為4,不更新最小長度。遞增i,直到i=3,此時和15>10,更新最小長度為2,4. 依次類推

最終得到最小長度為2.具體代碼如下:

int subSeqWithPositive(vector<int>& data,int sum){int i = 0 ,j = 0,length = data.size(),curSum = 0,res = length+1;while (j < length){while (curSum <= sum)//移動後指標{curSum += data[j++];if(j >= length)break;}while (curSum > sum)//移動前指標{if (res > j - i) res = j - i;curSum -= data[i++];}}return res;}



待字閨中之子序列分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.