国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【四】【算法分析與設(shè)計】貪心算法的初見

這篇具有很好參考價值的文章主要介紹了【四】【算法分析與設(shè)計】貪心算法的初見。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

455. 分發(fā)餅干

假設(shè)你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個孩子最多只能給一塊餅干。

對每個孩子 i,都有一個胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個尺寸 s[j]。如果 s[j] >= g[i],我們可以將這個餅干 j 分配給孩子 i ,這個孩子會得到滿足。你的目標(biāo)是盡可能滿足越多數(shù)量的孩子,并輸出這個最大數(shù)值。

示例 1:

輸入: g = [1,2,3], s = [1,1] 輸出: 1 解釋: 你有三個孩子和兩塊小餅干,3個孩子的胃口值分別是:1,2,3。 雖然你有兩塊小餅干,由于他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。 所以你應(yīng)該輸出1。

示例 2:

輸入: g = [1,2], s = [1,2,3] 輸出: 2 解釋: 你有兩個孩子和三塊小餅干,2個孩子的胃口值分別是1,2。 你擁有的餅干數(shù)量和尺寸都足以讓所有孩子滿足。 所以你應(yīng)該輸出2.

提示:

  • 1 <= g.length <= 3 * 10(4)

  • 0 <= s.length <= 3 * 10(4)

  • 1 <= g[i], s[j] <= 2(31) - 1

 
class Solution {
public:
    int findContentChildren(vector<int>& children, vector<int>& cookies) {
        sort(children.begin(), children.end());
        sort(cookies.begin(), cookies.end());
        int child = 0, cookie = 0;
        while (child < children.size() && cookie < cookies.size()) {
            if (children[child] <= cookies[cookie])
                ++child;
            ++cookie;
        }
        return child;
    }
};

【四】【算法分析與設(shè)計】貪心算法的初見,算法設(shè)計與分析,算法,leetcode

問題的核心是盡可能滿足更多孩子的胃口,每個孩子最多能得到一塊餅干,每塊餅干也只能分給一個孩子,給定一個孩子數(shù)組children代表每個孩子的胃口值,一個餅干數(shù)組cookies代表每塊餅干的大小,求最多有多少孩子能得到餅干滿足胃口。

sort(children.begin(), children.end());這行代碼將children數(shù)組按胃口值從小到大排序。

sort(cookies.begin(), cookies.end());這行代碼將cookies數(shù)組按餅干大小從小到大排序。

int child = 0, cookie = 0;初始化兩個變量childcookie,分別表示當(dāng)前考慮到的孩子和餅干的索引。

while (child < children.size() && cookie < cookies.size()) {這個循環(huán)繼續(xù)執(zhí)行直到所有孩子都被考慮過或所有餅干都被嘗試分配。

if (children[child] <= cookies[cookie]) ++child;如果當(dāng)前餅干的大小能滿足當(dāng)前孩子的胃口,那么這個孩子被滿足,移動到下一個孩子。

++cookie;無論當(dāng)前的餅干是否能滿足當(dāng)前的孩子,都將考慮下一塊餅干。

時間復(fù)雜度和空間復(fù)雜度

時間復(fù)雜度:O(nlogn)。主要時間開銷來自于排序childrencookies數(shù)組,假設(shè)childrencookies的長度分別為m和n,那么時間復(fù)雜度為O(mlogm + nlogn)。遍歷數(shù)組的過程時間復(fù)雜度為O(m+n),所以總體時間復(fù)雜度為O(nlogn),這里n是兩個數(shù)組中較長的那個的長度。

空間復(fù)雜度:O(1)。除了輸入的數(shù)組外,我們只使用了常數(shù)空間。

135. 分發(fā)糖果

n 個孩子站成一排。給你一個整數(shù)數(shù)組 ratings 表示每個孩子的評分。

你需要按照以下要求,給這些孩子分發(fā)糖果:

  • 每個孩子至少分配到 1 個糖果。

  • 相鄰兩個孩子評分更高的孩子會獲得更多的糖果。

請你給每個孩子分發(fā)糖果,計算并返回需要準(zhǔn)備的 最少糖果數(shù)目

示例 1:

輸入:ratings = [1,0,2] 輸出:5 解釋:你可以分別給第一個、第二個、第三個孩子分發(fā) 2、1、2 顆糖果。

示例 2:

輸入:ratings = [1,2,2] 輸出:4 解釋:你可以分別給第一個、第二個、第三個孩子分發(fā) 1、2、1 顆糖果。 第三個孩子只得到 1 顆糖果,這滿足題面中的兩個條件。

提示:

  • n == ratings.length

  • 1 <= n <= 2 * 10(4)

  • 0 <= ratings[i] <= 2 * 10(4)

 
class Solution {
public:
    int candy(vector<int>& ratings) {
        int size = ratings.size();
        if (size < 2) {
            return size;
        }
        vector<int> num(size, 1);
        for (int i = 1; i < size; ++i) {
            if (ratings[i] > ratings[i - 1]) {
                num[i] = num[i - 1] + 1;
            }
        }
        for (int i = size - 1; i > 0; --i) {
            if (ratings[i] < ratings[i - 1]) {
                num[i - 1] = max(num[i - 1], num[i] + 1);
            }
        }
        return accumulate(num.begin(), num.end(),0); // std::accumulate 可以很方便地求和
    }
};

【四】【算法分析與設(shè)計】貪心算法的初見,算法設(shè)計與分析,算法,leetcode

定義變量 size 為評分?jǐn)?shù)組 ratings 的長度。

如果 size 小于 2,直接返回 size。因為如果只有一個孩子,那他就是唯一的獲得糖果的人,直接返回1;如果沒有孩子,返回0。

初始化一個大小與 ratings 相同,值全為1的數(shù)組 num。這一步確保了每個孩子至少得到一顆糖果。

第一次遍歷:從左到右遍歷 ratings

如果當(dāng)前孩子(i對應(yīng)孩子)的評分高于左邊的孩子(ratings[i] > ratings[i - 1]),則當(dāng)前孩子得到的糖果數(shù)應(yīng)該比左邊的孩子多一顆(num[i] = num[i - 1] + 1)。

第二次遍歷:從右到左遍歷 ratings。

如果當(dāng)前孩子(i-1對應(yīng)孩子)的評分高于右邊的孩子(ratings[i] < ratings[i - 1]),則左邊的孩子得到的糖果數(shù)應(yīng)該是其原本的數(shù)目和右邊孩子的糖果數(shù)加一中的較大值(num[i - 1] = max(num[i - 1], num[i] + 1))。

最后,使用 accumulate 函數(shù)對 num 數(shù)組進(jìn)行求和,得到總共需要的糖果數(shù),并返回這個值。accumulate 函數(shù)起始值為0,意味著從0開始累加 num 數(shù)組中所有元素的值。

accumulate函數(shù)

accumulate 函數(shù)是 C++ 標(biāo)準(zhǔn)庫中 <numeric> 頭文件提供的一個非常實用的數(shù)值累加函數(shù)。它用于計算一個給定范圍內(nèi)所有元素的累加和,或者在提供了自定義操作時,按照該操作進(jìn)行累加。accumulate 的基本用法是計算序列的總和,但通過自定義加法操作,它也可以用于更復(fù)雜的累加操作,如累乘。

基本用法

基礎(chǔ)版本的 accumulate 接受三個參數(shù):序列的開始迭代器、結(jié)束迭代器和累加的初始值。如果不指定操作,則默認(rèn)進(jìn)行加法操作。下面是一個簡單的例子:

 
#include <numeric> // 引入accumulate的頭文件
#include <vector>

std::vector<int> v = {1, 2, 3, 4, 5};
int sum = std::accumulate(v.begin(), v.end(), 0); // 計算總和

在這個例子中,accumulate0 開始,將 v 中的每個元素相加,計算出總和為 15。

使用自定義操作

accumulate 還允許你指定一個自定義的二元操作函數(shù),來代替默認(rèn)的加法操作。這個二元操作接受兩個參數(shù):累加值(到當(dāng)前為止的結(jié)果)和序列中的當(dāng)前元素。這使得 accumulate 變得非常靈活,可以實現(xiàn)各種復(fù)雜的累加邏輯。

例如,使用 accumulate 來計算一個數(shù)列的乘積:

 
#include <numeric>
#include <vector>

std::vector<int> v = {1, 2, 3, 4, 5};
int product = std::accumulate(v.begin(), v.end(), 1, [](int a, int b) {
    return a * b;
});

這里,初始值設(shè)為 1(乘法的單位元),并通過一個 lambda 表達(dá)式指定乘法為累加操作。最終,product 的值為 120,即 1*2*3*4*5 的結(jié)果。

注意事項

accumulate 默認(rèn)使用加法操作時,累加初始值的類型決定了整個操作的類型。例如,如果初始值為整數(shù),那么即使數(shù)組是浮點數(shù),累加結(jié)果也會被截斷為整數(shù)。因此,選擇合適的初始值類型是非常重要的。

435. 無重疊區(qū)間

給定一個區(qū)間的集合 intervals ,其中 intervals[i] = [start(i), end(i)] 。返回 需要移除區(qū)間的最小數(shù)量,使剩余區(qū)間互不重疊 。

示例 1:

輸入: intervals = [[1,2],[2,3],[3,4],[1,3]] 輸出: 1 解釋: 移除 [1,3] 后,剩下的區(qū)間沒有重疊。

示例 2:

輸入: intervals = [ [1,2], [1,2], [1,2] ] 輸出: 2 解釋: 你需要移除兩個 [1,2] 來使剩下的區(qū)間沒有重疊。

示例 3:

輸入: intervals = [ [1,2], [2,3] ] 輸出: 0 解釋: 你不需要移除任何區(qū)間,因為它們已經(jīng)是無重疊的了。

提示:

  • 1 <= intervals.length <= 10(5)

  • intervals[i].length == 2

  • -5 * 10(4) <= start(i) < end(i) <= 5 * 10(4)

 
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
    if (intervals.empty()) {
        return 0;
    }
    int n = intervals.size();
    sort(intervals.begin(), intervals.end(), [](vector<int> a, vector<int> b) {
        return a[1] < b[1];
    });
    int total = 0, prev = intervals[0][1];
    for (int i = 1; i < n; ++i) {
        if (intervals[i][0] < prev) {
            ++total;
        } else {
            prev = intervals[i][1];
        }
    }
    return total;
 }

【四】【算法分析與設(shè)計】貪心算法的初見,算法設(shè)計與分析,算法,leetcode

檢查區(qū)間數(shù)組是否為空

if (intervals.empty()) { return 0; }如果區(qū)間數(shù)組為空,則沒有需要移除的區(qū)間,直接返回0。

獲取區(qū)間數(shù)組的大小

int n = intervals.size();這里定義了一個變量 n 來存儲區(qū)間數(shù)組的長度。

按區(qū)間結(jié)束時間排序

sort(intervals.begin(), intervals.end(), [](vector<int> a, vector<int> b) { return a[1] < b[1]; });使用標(biāo)準(zhǔn)庫函數(shù) sort,通過自定義的比較函數(shù),將區(qū)間按照結(jié)束時間升序排序。這樣做的目的是盡可能讓區(qū)間不重疊,因為結(jié)束得早的區(qū)間留給后面的區(qū)間的空間就越多。

初始化計數(shù)器和前一個區(qū)間的結(jié)束右端點

int total = 0, prev = intervals[0][1];初始化需要移除的區(qū)間數(shù)量 total 為0,并將 prev 設(shè)置為第一個區(qū)間的結(jié)束時間。prev 用于記錄當(dāng)前不重疊區(qū)間的最后一個區(qū)間的結(jié)束時間。

遍歷區(qū)間數(shù)組,確定需要移除的區(qū)間數(shù)量

for (int i = 1; i < n; ++i) { if (intervals[i][0] < prev) { ++total; } else { prev = intervals[i][1]; } }從第二個區(qū)間開始遍歷,如果當(dāng)前區(qū)間的開始時間小于前一個區(qū)間的結(jié)束時間 prev,說明這兩個區(qū)間重疊,需要移除一個區(qū)間,因此 total 自增1。如果不重疊,更新 prev 為當(dāng)前區(qū)間的結(jié)束時間,繼續(xù)向后比較。

標(biāo)準(zhǔn)庫函數(shù)sort

C++ 標(biāo)準(zhǔn)庫中的 sort 函數(shù)是一個非常強大且靈活的排序算法,主要用于對數(shù)組或容器內(nèi)的元素進(jìn)行排序。它位于 <algorithm> 頭文件中。sort 函數(shù)可以對一個序列進(jìn)行默認(rèn)的升序排序,也可以通過自定義比較函數(shù)來指定排序規(guī)則。

基本用法

默認(rèn)情況下,sort 對序列進(jìn)行升序排序。如果你想對一個數(shù)組或者 vector 排序,可以這樣使用:

 
#include <algorithm> // 引入算法庫
#include <vector>

std::vector<int> v = {4, 2, 5, 3, 1};
std::sort(v.begin(), v.end());

在上述代碼中,v.begin()v.end() 分別是容器 v 的起始迭代器和終止迭代器,sort 函數(shù)會將 v 中的元素從小到大排序。

自定義比較函數(shù)

sort 函數(shù)允許你通過自定義比較函數(shù)來指定排序規(guī)則,這讓你能夠?qū)崿F(xiàn)復(fù)雜的排序邏輯,比如降序排序或者根據(jù)對象的某個屬性排序。

自定義比較函數(shù)可以是一個普通函數(shù),也可以是一個lambda表達(dá)式。比較函數(shù)需要接受兩個參數(shù)(被比較的元素),并返回一個布爾值,指示第一個參數(shù)是否應(yīng)該位于第二個參數(shù)之前。

使用普通函數(shù)作為比較函數(shù)

 
bool compare(int a, int b) {
    return a > b; // 降序排序
}

std::vector<int> v = {4, 2, 5, 3, 1};
std::sort(v.begin(), v.end(), compare);

使用 Lambda 表達(dá)式

Lambda 表達(dá)式提供了一種便捷的方式來定義臨時的比較函數(shù),這在實現(xiàn)簡單的自定義排序規(guī)則時非常有用:

 
std::vector<int> v = {4, 2, 5, 3, 1};
std::sort(v.begin(), v.end(), [](int a, int b) {
    return a > b; // 降序排序
});

對象排序

如果你想根據(jù)對象的某個屬性排序,可以這樣做:

 
struct Person {
    std::string name;
    int age;
};

bool compareByAge(const Person& a, const Person& b) {
    return a.age < b.age; // 按年齡升序排序
}

std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Carol", 20}};
std::sort(people.begin(), people.end(), compareByAge);

或者使用 Lambda 表達(dá)式:

 
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
    return a.age < b.age; // 按年齡升序排序
});

結(jié)尾

最后,感謝您閱讀我的文章,希望這些內(nèi)容能夠?qū)δ兴鶈l(fā)和幫助。如果您有任何問題或想要分享您的觀點,請隨時在評論區(qū)留言。

同時,不要忘記訂閱我的博客以獲取更多有趣的內(nèi)容。在未來的文章中,我將繼續(xù)探討這個話題的不同方面,為您呈現(xiàn)更多深度和見解。

謝謝您的支持,期待與您在下一篇文章中再次相遇!文章來源地址http://www.zghlxwxcb.cn/news/detail-840795.html

到了這里,關(guān)于【四】【算法分析與設(shè)計】貪心算法的初見的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 計算機算法分析與設(shè)計(14)---貪心算法(會場安排問題和最優(yōu)服務(wù)次序問題)

    計算機算法分析與設(shè)計(14)---貪心算法(會場安排問題和最優(yōu)服務(wù)次序問題)

    ?假設(shè)在足夠多的會場里安排一批活動,并希望使用盡可能少的會場。設(shè)計一個有效的貪心算法進(jìn)行安排。 數(shù)據(jù)輸入: 第 1 1 1 行中有一個整數(shù) n n n ,表示有 n n n 個待安排的活動。接下來的 n n n 行中,每行有 2 2 2 個正整數(shù),分別表示 n n n 個待安排的活動的開始時間和結(jié)束

    2024年02月02日
    瀏覽(18)
  • 算法分析與設(shè)計考前沖刺 (算法基礎(chǔ)、數(shù)據(jù)結(jié)構(gòu)與STL、遞歸和分治、 動態(tài)規(guī)劃、貪心算法、 回溯算法)

    算法分析與設(shè)計考前沖刺 算法基礎(chǔ) 算法是一系列解決問題的清晰指令,代表著用系統(tǒng)的方法描述解決問題的策略機制。 程序是算法用某種程序設(shè)計語言的具體的 具體實現(xiàn) 算法特征: 有窮性(有限步) 確定性 輸入 輸出 可行性(有限時間) 算法的復(fù)雜性: 時間復(fù)雜性 和空間復(fù)

    2024年02月02日
    瀏覽(25)
  • 湘潭大學(xué) 算法設(shè)計與分析實驗 回溯 動態(tài)規(guī)劃 貪心 模擬退火解決背包問題

    https://download.csdn.net/download/SQ_ZengYX/88620871 測試用例

    2024年02月02日
    瀏覽(41)
  • 算法分析與設(shè)計-會場安排問題(貪心)(通俗易懂,附源碼和圖解,含貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)的證明)(c++)

    算法分析與設(shè)計-會場安排問題(貪心)(通俗易懂,附源碼和圖解,含貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)的證明)(c++)

    (一)題目 問題描述 假設(shè)在足夠多的會場里安排一批活動,并希望使用盡可能少的會場。設(shè)計一個有效的貪心算法進(jìn)行安排。(這個問題實際上是著名的圖著色問題。若將每個活動作為圖的一個頂點,不相容活動間用邊相連。使相鄰頂點有著不同顏色的最小著色數(shù),相當(dāng)于

    2024年02月07日
    瀏覽(62)
  • 算法沉淀——貪心算法三(leetcode真題剖析)

    算法沉淀——貪心算法三(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 給你一個整數(shù)數(shù)組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。 在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。 返回 你能獲得

    2024年03月24日
    瀏覽(19)
  • 算法沉淀——貪心算法六(leetcode真題剖析)

    算法沉淀——貪心算法六(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/broken-calculator/ 在顯示著數(shù)字 startValue 的壞計算器上,我們可以執(zhí)行以下兩種操作: **雙倍(Double):**將顯示屏上的數(shù)字乘 2; **遞減(Decrement):**將顯示屏上的數(shù)字減 1 。 給定兩個整數(shù) startValue 和 target 。返回顯示數(shù)字 target 所需的最小操

    2024年04月11日
    瀏覽(44)
  • 算法沉淀——貪心算法二(leetcode真題剖析)

    算法沉淀——貪心算法二(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/longest-increasing-subsequence/ 給你一個整數(shù)數(shù)組 nums ,找到其中最長嚴(yán)格遞增子序列的長度。 子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 示

    2024年03月19日
    瀏覽(67)
  • 算法沉淀——貪心算法五(leetcode真題剖析)

    算法沉淀——貪心算法五(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/jump-game-ii/ 給定一個長度為 n 的 0 索引 整數(shù)數(shù)組 nums 。初始位置為 nums[0] 。 每個元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處: 0 = j = nums[i] i + j n 返回到達(dá) nums[n - 1] 的最小跳躍次

    2024年04月11日
    瀏覽(22)
  • 算法沉淀——貪心算法一(leetcode真題剖析)

    算法沉淀——貪心算法一(leetcode真題剖析)

    貪心算法(Greedy Algorithm)是一種基于貪心策略的優(yōu)化算法,它通常用于求解最優(yōu)化問題,每一步都選擇當(dāng)前狀態(tài)下的最優(yōu)解,以期望通過局部最優(yōu)的選擇最終達(dá)到全局最優(yōu)。貪心算法的思想是在每一步都做出在當(dāng)前狀態(tài)下局部最優(yōu)的選擇,而不考慮未來可能造成的影響。 在

    2024年03月08日
    瀏覽(17)
  • 算法沉淀——貪心算法七(leetcode真題剖析)

    算法沉淀——貪心算法七(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/integer-replacement/ 給定一個正整數(shù) n ,你可以做如下操作: 如果 n 是偶數(shù),則用 n / 2 替換 n 。 如果 n 是奇數(shù),則可以用 n + 1 或 n - 1 替換 n 。 返回 n 變?yōu)?1 所需的 最小替換次數(shù) 。 示例 1: 示例 2: 示例 3: 提示: 1 = n = 2^31 - 1 思路 這里我們

    2024年03月23日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包