一、貪心基礎 assign cookies
假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多只能給一塊餅乾。對每個孩子 i ,都有乙個胃口值 g(i) ,這是能讓孩子們滿足胃口的餅乾的最小尺寸;並且每塊餅乾 j ,都有乙個尺寸 s(j) 。如果 s(j) >= g(i) ,我們可以將這個餅乾 j 分配給孩子 i ,這個孩子會得到滿足。你的目標是盡可能滿足越多數量的孩子,並輸出這個最大數值。
注意:你可以假設胃口值為正。
乙個小朋友最多只能擁有一塊餅乾。
示例 1:
輸入: [1,2,3], [1,1]
輸出: 1
解釋:
你有三個孩子和兩塊小餅乾,3個孩子的胃口值分別是:1,2,3。
雖然你有兩塊小餅乾,由於他們的尺寸都是1,你只能讓胃口值是1的孩子滿足。
所以你應該輸出1。
示例 2:
輸入: [1,2], [1,2,3]
輸出: 2
解釋:
你有兩個孩子和三塊小餅乾,2個孩子的胃口值分別是1,2。
你擁有的餅乾數量和尺寸都足以讓所有孩子滿足。
所以你應該輸出2.
解決思路
先把餅乾按大小排序, 小朋友按胃口大小排序
如果最大的餅乾能滿足胃口最大的小朋友, 就把最大的餅乾給他,
否則就把最大的餅乾給胃口第二大的小朋友....以此類推
**#include
#include
#include
using namespace std;
/// 455. assign cookies
///
/// 貪心演算法
/// 時間複雜度: o(n)
/// 空間複雜度: o(n)
class solution
return intervals.size() - res;}};
三. 貪心選擇性質的證明
一般過程如下:
假設貪心演算法為a 不是最優解,
則存在乙個最優演算法o
只要證明a完全可以代替o,且不影響求出最優解 即可
上一節中貪心選擇性質的證明
題目: 給定一組區間, 問最多保留多少個區間, 可以讓這些區間之間相互不重疊。
貪心演算法: 按照區間的結尾排序, 每次選擇結尾最早的, 且和前乙個區間不重疊的區間
反證法證明:
貪心演算法的 某次選擇的是[s(i), f(i)] 這個區間; 其中f(i)是當前所有選擇中結尾最早的
假設這個選擇不是最優解。 也就是說, 如果這個問題的最優解為k, 則這個問題得到的解, 最多為k-1
假設最優解在這一步選擇的是[s(j), f(j)], f(j)>f(i)
顯然 可以將[s(i),f(i)]替換[s(j),f(j)], 而不影響後序的區間選擇:
f(j)>f(i) 顯然不會影響後面選擇
而s(i)和s(i), 則隱藏在條件中:
前面的m次選擇是一樣的, 到這一次 使用'貪心選擇'還是 '最優選擇', 都不會對全面已經選擇過的區間 產生影響了
---------------------
演算法基礎 貪心策略
本文主要作為自己的學習筆記,並不具備過多的指導意義。概述 貪心演算法通常用來求解最優問題 由區域性最優解到整體最優解 通過不斷對區域性最優進行操作,最終達到整體最優 無後效性 後序操作,不會出現資料狀態的回滾 和dp 動態規劃 之間的聯絡 很多貪心問題可以通過dp進行求解 最優裝載問題 給出n個物體...
演算法基礎 貪心演算法
貪心演算法是常見的基礎演算法,它在求解問題時總想用當前看來最好的方法去實現,而到了下一步,再用下一步時最好的方法來解決,因此有了貪心的名字。此方法不從整體去考慮,僅是在某種意義上的區域性最優求解。雖然貪心演算法不是對所有的問題都能得到整體最優解,但是面對範圍相當廣泛的很多問題時,能產生整體最優解或是...
三值排序(貪心基礎)
寫乙個程式計算出,計算出的乙個包括1 2 3三種值的數字序列,排成公升序所需的最少交換次數。輸入第1行為類別的數量n 1 n 1000 輸入第2行到第n 1行,每行包括乙個數字 1或2或3 輸出包含一行,為排成公升序所需的最少交換次數。922 1333 231 樣例輸出4 思路 統計1,2,3的個數...