圖解LeetCode——862. 和至少為 K 的最短子數(shù)組(難度:困難)

一茶行、題目

給你一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) k ,找出 nums 中和至少為 k最短非空子數(shù)組 气堕,并返回該子數(shù)組的長(zhǎng)度纺腊。如果不存在這樣的 子數(shù)組 ,返回 -1 茎芭。

子數(shù)組 是數(shù)組中 連續(xù) 的一部分揖膜。

二、示例

2.1> 示例 1:

【輸入】nums = [1], k = 1
【輸出】1

2.2> 示例 2:

【輸入】nums = [1,2], k = 4
【輸出】-1

2.3> 示例 3:

【輸入】nums = [2,-1,2], k = 3
【輸出】3

提示:

  • 1 <= nums.length <= 10^5
  • -10^5 <= nums[i] <= 10^5
  • 1 <= k <= 10^9

三梅桩、解題思路

根據(jù)題目描述壹粟,我們要找到N個(gè)子序列,并且要求子序列的總和要大于等于k宿百,并且只要最短長(zhǎng)度趁仙。那么,對(duì)于一個(gè)數(shù)組有多少子序列垦页,我們首先需要確定數(shù)組子序列的起點(diǎn)雀费。那么,由于題目中只需要最短長(zhǎng)度痊焊,所以盏袄,假設(shè)我們以i為起點(diǎn)向后拼裝子序列,只要子序列總和大于等于k薄啥,則立刻結(jié)束以i為起點(diǎn)的子序列組合行為辕羽。具體如下圖所示:

為了避免不同起點(diǎn)執(zhí)行拼裝子序列會(huì)產(chǎn)生重復(fù)操作,所以垄惧,我們采取前綴和的方式刁愿,即:計(jì)算位置i之前的所有元素之和。以nums=[2, -1, 2, 3, 4]為例赘艳,對(duì)應(yīng)的前綴和就是[0, 2, 1, 3, 6, 10]酌毡。我們通過(guò)遍歷數(shù)組nums的前綴和克握,將某個(gè)元素i的前綴和放入到隊(duì)列中蕾管,這樣枷踏,從末尾執(zhí)行插入,從隊(duì)首執(zhí)行彈出掰曾。

那么旭蠕,其實(shí)對(duì)于哪些數(shù)為起點(diǎn),也是有優(yōu)化空間的旷坦。就是說(shuō)掏熬,以下圖所示,當(dāng)我們發(fā)現(xiàn)E的前綴和sum(A-D)大于等于F的前綴和sum(A-E)秒梅,我們其實(shí)就沒(méi)必要以E為起點(diǎn)了旗芬,因?yàn)镕相比E會(huì)更適合。具體邏輯如下圖所示:

四捆蜀、代碼實(shí)現(xiàn)

class Solution {
    public int shortestSubarray(int[] nums, int k) {
        int result = Integer.MAX_VALUE, n = nums.length, head = 0, tail = head;
        long[] preSum = new long[n + 1];
        /** 步驟1:構(gòu)建前綴和 */
        for (int i = 0; i < n; i++) {
            if (nums[i] >= k) return 1;
            preSum[i + 1] = preSum[i] + nums[i];
        }
        /** 步驟2:構(gòu)建單調(diào)棧和使用單調(diào)棧求最小值 */
        int[] queue = new int[n + 1];
        for (int i = 0; i < n + 1; i++) {
            while (head != tail && preSum[queue[tail - 1]] >= preSum[i]) 
                tail--;
            queue[tail++] = i;
            while (head != tail && preSum[i] - preSum[queue[head]] >= k) 
                result = Math.min(i - queue[head++], result);
        }
        return result == Integer.MAX_VALUE ? -1 : result;
    }
}

今天的文章內(nèi)容就這些了:

寫(xiě)作不易疮丛,筆者幾個(gè)小時(shí)甚至數(shù)天完成的一篇文章,只愿換來(lái)您幾秒鐘的 點(diǎn)贊 & 分享 辆它。

更多技術(shù)干貨誊薄,歡迎大家關(guān)注公眾號(hào)“爪哇繆斯” ~ \(o)/ ~ 「干貨分享,每天更新」

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锰茉,一起剝皮案震驚了整個(gè)濱河市呢蔫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飒筑,老刑警劉巖片吊,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異协屡,居然都是意外死亡定鸟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)著瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)联予,“玉大人,你說(shuō)我怎么就攤上這事材原》芯茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵余蟹,是天一觀的道長(zhǎng)卷胯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)威酒,這世上最難降的妖魔是什么窑睁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任挺峡,我火速辦了婚禮,結(jié)果婚禮上担钮,老公的妹妹穿的比我還像新娘橱赠。我一直安慰自己,他們只是感情好箫津,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布狭姨。 她就那樣靜靜地躺著,像睡著了一般苏遥。 火紅的嫁衣襯著肌膚如雪饼拍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天田炭,我揣著相機(jī)與錄音师抄,去河邊找鬼。 笑死教硫,一個(gè)胖子當(dāng)著我的面吹牛叨吮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栋豫,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挤安,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丧鸯?” 一聲冷哼從身側(cè)響起蛤铜,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丛肢,沒(méi)想到半個(gè)月后围肥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜂怎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年穆刻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杠步。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氢伟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幽歼,到底是詐尸還是另有隱情朵锣,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布甸私,位于F島的核電站诚些,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏皇型。R本人自食惡果不足惜诬烹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一砸烦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绞吁,春花似錦幢痘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)西轩。三九已至员舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕畔,已是汗流浹背马僻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留注服,地道東北人韭邓。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像溶弟,于是被迫代替她去往敵國(guó)和親女淑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容