51nod-2582 最短區(qū)間

假如到當前位置的前綴和為sumi,我們的目標是找到最大的j,滿足sumi?sum(j?1)>=s。這樣從j?i的區(qū)間和就是大于s的,找最大的j,是為了滿足最短的要求。假如對于每一個位置i,我們都記錄了符合條件的最大的j,就可以遍歷找出最短的區(qū)間了。

以上算法的暴力實現,是O(n2)的。

優(yōu)化: 由于ai>=0?,因此sumi是單調遞增的,看到了單調性,我們自然而然的想起了二分,找最大的滿足條件的j,我們可以通過二分來做,這樣復雜度就從O(n2)變?yōu)榱薕(nlogn)。

我們可以繼續(xù)優(yōu)化這個算法。

我們設以as開始總和最初大于S時的連續(xù)子序列as+...+at?1,這時as?1+...+at?2<as+...+at?2<S。

可以設計如下算法:

  • 以s=t=sum=0開始
  • 只要依然有sum<S,就不斷將at加入到sum中,并將t增加1
  • 如果2中無法滿足sum>=S則終止,否則的話更新答案 res=min(res,t?s)
  • 將sum減去as,s增加1然后回到2。

對于這個算法,因為t最多變化n次,因此只需要O(n)的復雜度就可以解決這個問題了。甚至可以不用預處理前綴

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,214評論 0 3
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,061評論 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,144評論 0 2
  • 尺寸: 長285,寬46,高86,案,楠木制,兩面一樣工,牙板刻龍紋,造型大氣,品相基本完好。
    白開水_de8d閱讀 456評論 0 0
  • 文:楊柳君 目前在國內,處于成長期的中小型民營企業(yè),靠“經驗”、憑“直覺”管理是常態(tài)。形成這個現狀的原因很復雜。 ...
    楊柳君閱讀 236評論 0 1

友情鏈接更多精彩內容