LeetCode #862 Shortest Subarray with Sum at Least K 和至少為 K 的最短子數(shù)組

862 Shortest Subarray with Sum at Least K 和至少為 K 的最短子數(shù)組

Description:
Given an integer array nums and an integer k, return the length of the shortest non-empty subarray of nums with a sum of at least k. If there is no such subarray, return -1.

A subarray is a contiguous part of an array.

Example:

Example 1:

Input: nums = [1], k = 1
Output: 1

Example 2:

Input: nums = [1,2], k = 4
Output: -1

Example 3:

Input: nums = [2,-1,2], k = 3
Output: 3

Constraints:

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

題目描述:
返回 A 的最短的非空連續(xù)子數(shù)組的長度馍盟,該子數(shù)組的和至少為 K 。

如果沒有和至少為 K 的非空子數(shù)組忘朝,返回 -1 麻汰。

示例 :

示例 1:

輸入:A = [1], K = 1
輸出:1

示例 2:

輸入:A = [1,2], K = 4
輸出:-1

示例 3:

輸入:A = [2,-1,2], K = 3
輸出:3

提示:

1 <= A.length <= 50000
-10 ^ 5 <= A[i] <= 10 ^ 5
1 <= K <= 10 ^ 9

思路:

前綴和 + 單調(diào)隊列
由于題目要求求連續(xù)的子數(shù)組, 考慮使用滑動窗口, 但是因為數(shù)組中有負(fù)數(shù), 不滿足單調(diào)性, 所以不能使用滑動窗口
可以用類似滑動窗口的思想, 使用前綴和
因為需要求出子數(shù)組的和, 可以用前綴和預(yù)先處理, 方便查找子數(shù)組的和
假定已經(jīng)找到 i1 < i2 < j, pre[i1] >= pre[i2], 如果有 pre[j] - pre[i1] >= k, 那么一定有 pre[j] - pre[i2] >= k, 由于 i1 < i2, 所以 j - i1 > j - i2, 這時可以保證 i1 必然不是需要的值
所以需要一個單調(diào)隊列來存放, 遍歷到比隊列尾對應(yīng)的前綴和小的時候, 彈出隊尾
比如 [1, 3, -2, 4] -> [0, 1, 4, 2, 6], 6 - 2 > 6 - 4, 所以 4 應(yīng)該被彈出
按照滑動窗口的思想, 如果 pre[j] - pre[queue.front()] >= k, 這時可以彈出隊頭并且更新結(jié)果值
最后需要判斷是否存在結(jié)果滿足 k
時間復(fù)雜度為 O(n), 空間復(fù)雜度為 O(n)

代碼:
C++:

class Solution 
{
public:
    int shortestSubarray(vector<int>& nums, int k) 
    {
        int n = nums.size(), result = n + 1;
        vector<int> pre(n + 1, 0);
        for (int i = 0; i < n; i++) pre[i + 1] = pre[i] + nums[i];
        list<int> queue;
        for (int i = 0; i <= n; i++) 
        {
            while (!queue.empty() and pre[i] <= pre[queue.back()]) queue.pop_back();
            while (!queue.empty() and pre[i] - pre[queue.front()] >= k) 
            {
                result = min(result, i - queue.front());
                queue.pop_front();
            }
            queue.push_back(i);
        }
        return result == n + 1 ? -1 : result;
    }
};

Java:

class Solution {
    public int shortestSubarray(int[] nums, int k) {
        int n = nums.length, result = n + 1, pre[] = new int[n + 1];
        for (int i = 0; i < n; i++) pre[i + 1] = pre[i] + nums[i];
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = 0; i <= n; i++) {
            while (!queue.isEmpty() && pre[i] <= pre[queue.peekLast()]) queue.pollLast();
            while (!queue.isEmpty() && pre[i] - pre[queue.peek()] >= k) result = Math.min(result, i - queue.poll());
            queue.add(i);
        }
        return result == n + 1 ? -1 : result;
    }
}

Python:

class Solution:
    def shortestSubarray(self, nums: List[int], k: int) -> int:
        pre, result, queue = [0] + list(accumulate(nums)), (n := len(nums)) + 1, deque()
        for i, v in enumerate(pre):
            while queue and v <= pre[queue[-1]]:
                queue.pop()
            while queue and v - pre[queue[0]] >= k:
                result = min(result, i - queue.popleft())
            queue.append(i)
        return result if result < n + 1 else -1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫌变,一起剝皮案震驚了整個濱河市璃饱,隨后出現(xiàn)的幾起案子胖笛,更是在濱河造成了極大的恐慌眠副,老刑警劉巖画切,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異囱怕,居然都是意外死亡槽唾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門光涂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庞萍,“玉大人,你說我怎么就攤上這事忘闻《奂疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵齐佳,是天一觀的道長私恬。 經(jīng)常有香客問我,道長炼吴,這世上最難降的妖魔是什么本鸣? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮硅蹦,結(jié)果婚禮上荣德,老公的妹妹穿的比我還像新娘闷煤。我一直安慰自己,他們只是感情好涮瞻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布鲤拿。 她就那樣靜靜地躺著,像睡著了一般署咽。 火紅的嫁衣襯著肌膚如雪近顷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天宁否,我揣著相機(jī)與錄音窒升,去河邊找鬼。 笑死慕匠,一個胖子當(dāng)著我的面吹牛饱须,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播絮重,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冤寿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了青伤?” 一聲冷哼從身側(cè)響起督怜,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狠角,沒想到半個月后号杠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丰歌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年姨蟋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立帖。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡眼溶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晓勇,到底是詐尸還是另有隱情堂飞,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布绑咱,位于F島的核電站绰筛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏描融。R本人自食惡果不足惜铝噩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窿克。 院中可真熱鬧骏庸,春花似錦毛甲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谋右。三九已至硬猫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間改执,已是汗流浹背啸蜜。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辈挂,地道東北人衬横。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像终蒂,于是被迫代替她去往敵國和親蜂林。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

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