題目一.分糖果
已知一些孩子和一些糖果,每個孩子有需求因子g,每個糖果有大小s,當某個糖果的大小s>= 某個孩子的需求因子g時,代表該糖果可以滿足該孩子;求使用這些糖果,最多能滿足多少孩子?(注意,某個孩子最多只能用1個糖果滿足)
例如,需求因子數組g=【5,10,2,9,15,9】;糖果大小數組s=【6,1,20,3,8】;最多可以滿足3個孩子。
class Solution {
public: //孩子們的需求因子g數組
int findContentChildren(std::vector<int>&g,std::vector<int>& s)
{ //糖果的大小 s數組
} //返回最多可以有多少孩子被滿足};
};
(選自 LeetCode 455. Assign Cookies)
分析:
例如,需求因子數組g=【5,10,2,9,15,9】;糖果大小數組s=【6,1,20,3,8】。為了更明顯的判斷某個孩子可以被某個糖果滿足,對g,s進行排序后觀察∶
g=[2,5,9,9,10,15];s=[1,3,6,8,20]。
1.是否可以直接暴力枚舉,對每個糖果都嘗試是否可以滿足某個孩子?
2.當某個孩子可以被多個糖果滿足時,是否需要優先用某個糖果滿足這個孩子?
3.當某個糖果可以滿足多個孩子時,是否需要優先滿足某個孩子?
貪心規律:
需求因子數組g=【2.5,9,9,10,15】;糖果大小數組s=【,3,6.8.20】。核心目標∶讓更多孩子得到滿足,有如下規律∶
1.某個糖果如果不能滿足某個孩子,則該糖果也—定不能滿足需求因子更大的孩子。如,
糖果1(s= 1)不能滿足孩子1(g=2),則不能滿足孩子2、孩子3、、孩子7;糖果2(s=3)不能滿足孩子2(g=5),則不能滿足孩子3、孩子4、…、孩子7;
2.某個孩子可以用更小的糖果滿足,則沒必要用更大糖果滿足,因為可以保留更大的糖果滿足需求因子更大的孩子。(貪心!)如,
孩子1(g=2),可以被糖果2(s=3)滿足,則沒必要用糖果3、糖果4、糖果5滿足;孩子2(g=5),可以被糖果3(s= 6)滿足,則沒必要用糖果4、糖果5滿足;
3.孩子的需求因子更小則其更容易被滿足,故優先從需求因子小的孩子嘗試,用某個糖果滿足一個較大需求因子的孩子或滿足一個較小需求因子的孩子效果是—樣的(最終滿足的總量不變).(貪心!)
算法思路:
1.對需求因子數組g與糖果大小數組S進行從小到大的排序。
2.按照從小到大的順序使用各糖果嘗試是否可滿足某個孩子,每個糖果只嘗試1次;若嘗試成功,則換下一個孩子嘗試;直到發現沒更多的孩子或者沒更多的糖果,循環結束。
算法實現:
#include <vector>
#include <algorithm>
class Solution {
public:
int findContentChildren(std::vector<int>&g,std::vector<int>& s){
std::sort (g.begin (),g.end()); //對孩子的需求因子g與糖果大小s兩數組排序
std::sort (s.begin (),s.end());
int child = 0;
int cookie_=_6; //hild代表已滿足了幾個孩子,cookie代表嘗試了幾個糖果
while(child<g.size()&&cookie<s.szie(){ //當孩子或糖果同時均未嘗試完時
if (g[chi1d] <= s[cookie]){ //當孩子孩子的滿足因子小於或等於糖果大小時
child++; //該糖果滿足了孩子,孩子指針child向后移動
}
Cookie++; //無論成功或失敗,每個糖果只嘗試一次,cookie向后移動
}
return child; //最終child即為得到滿足的孩子的個數
}
} ;
]