表現(xiàn)良好的最長(zhǎng)時(shí)間段 前綴和+單調(diào)棧

給你一份工作時(shí)間表 hours恭朗,上面記錄著某一位員工每天的工作小時(shí)數(shù)初厚。
我們認(rèn)為當(dāng)員工一天中的工作小時(shí)數(shù)大于 8 小時(shí)的時(shí)候被啼,那么這一天就是「勞累的一天」曾撤。
所謂「表現(xiàn)良好的時(shí)間段」斩披,意味在這段時(shí)間內(nèi)溜族,「勞累的天數(shù)」是嚴(yán)格 大于「不勞累的天數(shù)」
請(qǐng)你返回「表現(xiàn)良好時(shí)間段」的最大長(zhǎng)度垦沉。

示例 1:
輸入:hours = [9, 9, 6, 0, 6, 6, 9]
輸出:3
解釋:最長(zhǎng)的表現(xiàn)良好時(shí)間段是 [9,9,6]煌抒。

這個(gè)思路是看的解題思路里面一個(gè)Python3大佬的答案寫的。
https://leetcode-cn.com/problems/longest-well-performing-interval/solution/
大佬就是大佬厕倍,即使給出了思路寡壮,我還是看了好久好久才看懂,期間還去補(bǔ)習(xí)了單調(diào)棧前綴和的知識(shí)才看懂思路讹弯。
不了解或者不夠熟悉推薦再去補(bǔ)一下相關(guān)知識(shí):
單調(diào)棧和應(yīng)用實(shí)踐
前綴和
首先根據(jù)時(shí)間是否大于8况既,量化成1和-1利與計(jì)算, [9, 9, 6, 0, 6, 6, 9] => [1, 1, -1, -1, -1, -1, 1]闸婴,所以hours當(dāng)前是[1, 1, -1, -1, -1, -1, 1]坏挠。
這個(gè)操作比較好理解,其實(shí)理解題意邪乍,我們要做的就是得到一個(gè)區(qū)間降狠,這個(gè)區(qū)間里1和-1加起來要大于0。怎么方便的得到一個(gè)區(qū)間的和庇楞?很明顯榜配,這就是前綴和存在的意義。
轉(zhuǎn)化成前綴和prefixSrc = [0, 1, 2, 1, 0, -1, -2, -1]吕晌,我們?cè)谇熬Y和前面加了一個(gè)0蛋褥,是為了好操作。那如何得到一個(gè)區(qū)間呢睛驳?如果要得到[1,3]區(qū)間,根據(jù)前綴和定義需要用prefixSrc[3]-prefixSrc[1]烙心,所以我們需要得到數(shù)組中所有prefixSrc[b]-prefixSrc[a] > 0的[a,b]區(qū)間,就是我們需要的結(jié)果乏沸。


上圖所示淫茵,我們需要的就是那兩段紅色線段。我們選擇從后往前遍歷蹬跃,

如何得到第二段紅色線段呢匙瘪?

index=7,prefixSrc[7]=-1;需要找到左邊第一個(gè)比自己小的數(shù)字。這段描述熟悉不丹喻?到了單調(diào)棧登場(chǎng)的時(shí)候了薄货。
我們對(duì)prefixSrc = [0, 1, 2, 1, 0, -1, -2, -1]生成單調(diào)棧,stack=[0,5,6]碍论,對(duì)應(yīng)[0, -1, -2]谅猾,如果當(dāng)前元素大于棧頂元素,棧頂元素出棧鳍悠,因?yàn)?1 > -2赊瞬,所以6出棧,計(jì)算寬度width=7-6=1贼涩。

如何得到第一段紅色線段呢巧涧?

其實(shí)因?yàn)槲覀儽憷絠ndex=3的時(shí)候prefixSrc[3]的時(shí)候發(fā)現(xiàn)prefixSrc[3]大于0,此時(shí)棧內(nèi)只剩一個(gè)0遥倦,所以寬度width=3-0=3
因?yàn)?永遠(yuǎn)在第0位所以只要出現(xiàn)大于0的情況谤绳,0~n就是表現(xiàn)良好時(shí)間段成立的。
我們繼續(xù)舉個(gè)例子:

OA段跟BCD段都是我們需要的袒哥,而AB段則不是缩筛。想明白這個(gè)就明白了。

  1. DCB:從D往C遍歷的過程中我們會(huì)不斷把單調(diào)棧里面的index彈出去堡称,直到B瞎抛,得到DCB的寬度。
  2. AO:到A后發(fā)現(xiàn)大于零却紧,彈出棧底的0桐臊,得到OA的寬度

代碼實(shí)現(xiàn):

     /**
     * 使用前綴和+單調(diào)棧
     *
     * @param src 源數(shù)組
     */
    public int longestWPI(int[] hours) {
        int max = 0;
        Stack<Integer> stack = new Stack<>();
        int[] prefixSrc = new int[hours.length + 1];
        //大于8的置為1,否則置為-1
        for (int i = 0; i < hours.length; i++) {
            if (hours[i] > 8) {
                max = 1;
                hours[i] = 1;
            } else {
                hours[i] = -1;
            }
            //初始化前綴和數(shù)組
            prefixSrc[0] = 0;
            prefixSrc[i + 1] = prefixSrc[i] + hours[i];
        }
        for (int i = 0; i < prefixSrc.length - 1; i++) {
            //實(shí)現(xiàn)單調(diào)棧
            if (stack.isEmpty()) {
                stack.push(i);
            } else {
                if (prefixSrc[i] < prefixSrc[stack.peek()]) {
                    stack.push(i);
                }
            }
        }
        //開始尋找,從后往前遍歷
        for (int i = prefixSrc.length - 1; i >= 0; i--) {
            int last = i;
            while (!stack.isEmpty() && prefixSrc[i] > prefixSrc[stack.peek()]) {
                last = stack.pop();
            }
            if (last != i) {
                int width = i - last;
                max = max > width ? max : width;
            }
        }
        return max;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晓殊,一起剝皮案震驚了整個(gè)濱河市断凶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巫俺,老刑警劉巖认烁,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異介汹,居然都是意外死亡却嗡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嘹承,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗价,“玉大人,你說我怎么就攤上這事赶撰∩嘞猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵豪娜,是天一觀的道長(zhǎng)餐胀。 經(jīng)常有香客問我,道長(zhǎng)瘤载,這世上最難降的妖魔是什么否灾? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鸣奔,結(jié)果婚禮上墨技,老公的妹妹穿的比我還像新娘。我一直安慰自己挎狸,他們只是感情好扣汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锨匆,像睡著了一般崭别。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恐锣,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天茅主,我揣著相機(jī)與錄音,去河邊找鬼土榴。 笑死诀姚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玷禽。 我是一名探鬼主播赫段,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼矢赁!你這毒婦竟也來了瑞佩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤坯台,失蹤者是張志新(化名)和其女友劉穎炬丸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜒蕾,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠炬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咪啡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首启。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撤摸,靈堂內(nèi)的尸體忽然破棺而出毅桃,到底是詐尸還是另有隱情褒纲,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布钥飞,位于F島的核電站莺掠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏读宙。R本人自食惡果不足惜彻秆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望结闸。 院中可真熱鬧唇兑,春花似錦、人聲如沸桦锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽结耀。三九已至帕棉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饼记,已是汗流浹背香伴。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留具则,地道東北人即纲。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像博肋,于是被迫代替她去往敵國(guó)和親低斋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354