分发饼干
為了了滿足更多的小孩,就不要造成餅干尺寸的浪費。
大尺寸的餅干既可以滿足胃口大的孩子也可以滿足胃口小的孩子,那么就應該優先滿足胃口大的。
「這里的局部最優就是大餅干喂給胃口大的,充分利用餅干尺寸喂飽一個,全局最優就是喂飽盡可能多的小孩」。
可以嘗試使用貪心策略,先將餅干數組和小孩數組排序。
然后從后向前遍歷小孩數組,用大餅干優先滿足胃口大的,并統計滿足小孩數量。
如圖:
這個例子可以看出餅干9只有喂給胃口為7的小孩,這樣才是整體最優解,并想不出反例,那么就可以擼代碼了。
初版
class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int count=0;int size=s.size();vector<int> used(s.size(),0);for(int ii=0;ii<g.size();ii++){for(int jj=ii;jj<s.size();jj++){if(used[jj]==0){used[jj]=1;if(s[jj]>=g[ii]) {count++; break;}}}}return count;} };終版
// 時間復雜度:O(nlogn) // 空間復雜度:O(1) class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index = s.size() - 1; // 餅干數組的下表int result = 0;for (int i = g.size() - 1; i >= 0; i--) {if (index >= 0 && s[index] >= g[i]) {result++;index--;}}return result;} };用一個index來控制餅干數組的遍歷,遍歷餅干并沒有再起一個for循環,而是采用自減的方式,這也是常用的技巧。
想清楚局部最優,想清楚全局最優,感覺局部最優是可以推出全局最優,并想不出反例,那么就試一試貪心
總結
- 上一篇: 解数独-难哭了
- 下一篇: 计算器服务端/客户端