LeetCode455.分發餅乾

Tomorrowland_D發表於2024-07-24

LeetCode題目連結:https://leetcode.cn/problems/assign-cookies/description/

題目敘述

假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。但是,每個孩子最多隻能給一塊餅乾。

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

示例 1:

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

示例 2:

輸入: g = [1,2], s = [1,2,3]
輸出: 2

解釋:

你有兩個孩子和三塊小餅乾,2個孩子的胃口值分別是1,2。
你擁有的餅乾數量和尺寸都足以讓所有孩子滿足。
所以你應該輸出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>& g, vector<int>& s) {
		sort(g.begin(), g.end());
		sort(s.begin(), s.end());
		//作為胃口陣列的下標,最後index的大小就是滿足小孩胃口的個數
		int index = 0;
		for (int i = 0; i < s.size(); i++) {
			//index要小於小孩的個數,並且餅乾大於等於胃口時,更新下標索引
			if (index < g.size() && s[i] >= g[index]) index++;
		}
		//最後index的值就是滿足的小孩的個數
		return index;
	}
};

方案2

其實,我們也可以從相反的方向出發,用大的餅乾滿足胃口大的小孩,同時用一個變數result來表示結果,但是這個時候我們就不是遍歷餅乾陣列了,而是遍歷小孩陣列了

程式碼如下:

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--) {
			//一定要先判斷index是否 >=0。否則某些情況下會執行時錯誤
			if (index >= 0 && g[i] <= s[index]) {
				result++;
				index--;
			}
		}
		//最後result的值就是我們要求的結果
		return result;
	}
};

相關文章