最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(209.最短子數(shù)組之和)

 更新時(shí)間:2021年08月09日 16:30:05   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(209.最短子數(shù)組之和),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 209. Minimum Size Subarray Sum 最短子數(shù)組之和

Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.

Example: 

Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.

Follow up:
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).  

Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.

這道題給定了我們一個(gè)數(shù)字,讓求子數(shù)組之和大于等于給定值的最小長度,注意這里是大于等于,不是等于。跟之前那道 Maximum Subarray 有些類似,并且題目中要求實(shí)現(xiàn) O(n) 和 O(nlgn) 兩種解法,那么先來看 O(n) 的解法,需要定義兩個(gè)指針 left 和 right,分別記錄子數(shù)組的左右的邊界位置,然后讓 right 向右移,直到子數(shù)組和大于等于給定值或者 right 達(dá)到數(shù)組末尾,此時(shí)更新最短距離,并且將 left 像右移一位,然后再 sum 中減去移去的值,然后重復(fù)上面的步驟,直到 right 到達(dá)末尾,且 left 到達(dá)臨界位置,即要么到達(dá)邊界,要么再往右移動(dòng),和就會(huì)小于給定值。代碼如下:

解法一:

// O(n)
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.empty()) return 0;
        int left = 0, right = 0, sum = 0, len = nums.size(), res = len + 1;
        while (right < len) {
            while (sum < s && right < len) {
                sum += nums[right++];
            }
            while (sum >= s) {
                res = min(res, right - left);
                sum -= nums[left++];
            }
        }
        return res == len + 1 ? 0 : res;
    }
};

同樣的思路,我們也可以換一種寫法,參考代碼如下:

解法二:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int res = INT_MAX, left = 0, sum = 0;
        for (int i = 0; i < nums.size(); ++i) {
            sum += nums[i];
            while (left <= i && sum >= s) {
                res = min(res, i - left + 1);
                sum -= nums[left++];
            }
        }
        return res == INT_MAX ? 0 : res;
    }
};

下面再來看看 O(nlgn) 的解法,這個(gè)解法要用到二分查找法,思路是,建立一個(gè)比原數(shù)組長一位的 sums 數(shù)組,其中 sums[i] 表示 nums 數(shù)組中 [0, i - 1] 的和,然后對(duì)于 sums 中每一個(gè)值 sums[i],用二分查找法找到子數(shù)組的右邊界位置,使該子數(shù)組之和大于 sums[i] + s,然后更新最短長度的距離即可。代碼如下:

解法三:

// O(nlgn)
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int len = nums.size(), sums[len + 1] = {0}, res = len + 1;
        for (int i = 1; i < len + 1; ++i) sums[i] = sums[i - 1] + nums[i - 1];
        for (int i = 0; i < len + 1; ++i) {
            int right = searchRight(i + 1, len, sums[i] + s, sums);
            if (right == len + 1) break;
            if (res > right - i) res = right - i;
        }
        return res == len + 1 ? 0 : res;
    }
    int searchRight(int left, int right, int key, int sums[]) {
        while (left <= right) {
            int mid = (left + right) / 2;
            if (sums[mid] >= key) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }
};

我們也可以不用為二分查找法專門寫一個(gè)函數(shù),直接嵌套在 for 循環(huán)中即可,參加代碼如下:

解法四:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int res = INT_MAX, n = nums.size();
        vector<int> sums(n + 1, 0);
        for (int i = 1; i < n + 1; ++i) sums[i] = sums[i - 1] + nums[i - 1];
        for (int i = 0; i < n; ++i) {
            int left = i + 1, right = n, t = sums[i] + s;
            while (left <= right) {
                int mid = left + (right - left) / 2;
                if (sums[mid] < t) left = mid + 1;
                else right = mid - 1;
            }
            if (left == n + 1) break;
            res = min(res, left - i);
        }
        return res == INT_MAX ? 0 : res;
    }
};

討論:本題有一個(gè)很好的 Follow up,就是去掉所有數(shù)字是正數(shù)的限制條件,而去掉這個(gè)條件會(huì)使得累加數(shù)組不一定會(huì)是遞增的了,那么就不能使用二分法,同時(shí)雙指針的方法也會(huì)失效,只能另辟蹊徑了。其實(shí)博主覺得同時(shí)應(yīng)該去掉大于s的條件,只保留 sum=s 這個(gè)要求,因?yàn)檫@樣就可以在建立累加數(shù)組后用 2sum 的思路,快速查找 s-sum 是否存在,如果有了大于的條件,還得繼續(xù)遍歷所有大于 s-sum 的值,效率提高不了多少。

Github 同步地址:

https://github.com/grandyang/leetcode/issues/209

類似題目:

Minimum Window Substring

參考資料:

https://leetcode.com/problems/minimum-size-subarray-sum/

https://leetcode.com/problems/minimum-size-subarray-sum/discuss/59090/C%2B%2B-O(n)-and-O(nlogn)

https://leetcode.com/problems/minimum-size-subarray-sum/discuss/59078/Accepted-clean-Java-O(n)-solution-(two-pointers)

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(209.最短子數(shù)組之和)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)最短子數(shù)組之和內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++ class中成員與分配內(nèi)存的問題詳解

    c++ class中成員與分配內(nèi)存的問題詳解

    很多人都知道C++類是由結(jié)構(gòu)體發(fā)展得來的,所以他們的成員變量(C語言的結(jié)構(gòu)體只有成員變量)的內(nèi)存分配機(jī)制是一樣的,下面這篇文章主要給大家介紹了關(guān)于c++ class中成員與分配內(nèi)存問題的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Qt+OpenCV利用幀差法實(shí)現(xiàn)車輛識(shí)別

    Qt+OpenCV利用幀差法實(shí)現(xiàn)車輛識(shí)別

    所謂幀差法也就是對(duì)連續(xù)圖像幀做差分運(yùn)算,其結(jié)果與定義好的閾值比較,若大于閾值則為運(yùn)動(dòng)目標(biāo)值為1,否則值為0?。本文將利用幀差法實(shí)現(xiàn)車輛識(shí)別,感興趣的可以了解一下
    2022-08-08
  • Qt掃盲篇之QRegExp正則匹配類總結(jié)

    Qt掃盲篇之QRegExp正則匹配類總結(jié)

    這篇文章主要給大家介紹了關(guān)于Qt掃盲篇之QRegExp正則匹配類總結(jié)的相關(guān)資料,QRegExp是Qt框架中的一個(gè)類,用于進(jìn)行正則表達(dá)式的匹配和處理,它提供了多種模式來匹配不同的字符串,需要的朋友可以參考下
    2023-12-12
  • C++基于對(duì)話框的程序的框架實(shí)例

    C++基于對(duì)話框的程序的框架實(shí)例

    這篇文章主要介紹了C++基于對(duì)話框的程序的框架,以實(shí)例形式講述了C++對(duì)話框程序框架,有助于深入理解基于C++的Windows程序設(shè)計(jì),需要的朋友可以參考下
    2014-10-10
  • 帶你粗略了解C++流的讀寫文件

    帶你粗略了解C++流的讀寫文件

    這篇文章主要為大家總結(jié)了C++中輸入輸出流及文件流操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • C++歸并算法實(shí)例

    C++歸并算法實(shí)例

    這篇文章主要介紹了C++歸并算法,實(shí)例分析了C++實(shí)現(xiàn)基于歸并算法合并線性表的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C++中std::construct()與std::destroy()的使用

    C++中std::construct()與std::destroy()的使用

    std::construct()和std::destroy()是C++ STL中的函數(shù)模板,用于在已分配的存儲(chǔ)區(qū)域中構(gòu)造或銷毀對(duì)象,本文主要介紹了C++中std::construct()與std::destroy()的使用,感興趣的可以了解一下
    2024-02-02
  • c/c++基礎(chǔ)簡(jiǎn)單易懂的快速排序算法

    c/c++基礎(chǔ)簡(jiǎn)單易懂的快速排序算法

    這篇文章主要為大家介紹了c/c++基礎(chǔ)非常簡(jiǎn)單易懂的快速排序算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • C語言員工信息管理系統(tǒng)源代碼

    C語言員工信息管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了C語言員工信息管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • QT實(shí)現(xiàn)秒表項(xiàng)目

    QT實(shí)現(xiàn)秒表項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)秒表項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論

耿马| 泰兴市| 奉化市| 迁安市| 林口县| 石景山区| 桃园市| 清流县| 博爱县| 阿尔山市| 丹巴县| 铁岭县| 彝良县| 行唐县| 金寨县| 靖远县| 西丰县| 咸宁市| 辽源市| 贺州市| 鄢陵县| 广昌县| 土默特左旗| 乐山市| 仪陇县| 浠水县| 鹤岗市| 叶城县| 仁寿县| 衡南县| 景德镇市| 尖扎县| 永城市| 漳浦县| 桃园市| 儋州市| 泰顺县| 苏尼特右旗| 北辰区| 翁源县| 乌兰察布市|