这段代码是为LeetCode问题455. 分发饼干提供的两种解决方案。问题要求分配饼干给孩子,使尽可能多的孩子满足胃口。每个孩子都有一个胃口值,每个饼干都有一个尺寸值,饼干只能分给胃口值小于等于饼干尺寸的孩子。
方案1
cpp
#include <vector>
#include <algorithm>
using std::vector;
/*
* @lc app=leetcode.cn id=455 lang=cpp
*
* [455] 分发饼干
*/
// @lc code=start
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
std::sort(g.begin(),g.end());
std::sort(s.begin(),s.end());
int m = g.size(); // 孩子的数量
int n = s.size(); // 饼干的数量
int count = 0;
for (int i = 0, j = 0; i < m && j < n; i++, j++) {
while (j < n && g[i] > s[j]) {
j++;
}
if (j < n) {
count++;
}
}
return count;
}
};
// @lc code=end
方案2
cpp
#include <vector>
#include <algorithm>
using std::vector;
/*
* @lc app=leetcode.cn id=455 lang=cpp
*
* [455] 分发饼干
*/
// @lc code=start
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
std::sort(g.begin(), g.end());
std::sort(s.begin(), s.end());
int child = 0; // 能吃饱的孩子数量
int cookie = 0;
while (child < g.size() && cookie < s.size()) {
if (g[child] <= s[cookie++]) {
child++;
}
}
return child;
}
};
// @lc code=end
两种方案的解释和比较
方案1的解释
- 首先对孩子的胃口值数组
g
和饼干尺寸数组s
进行排序。 - 使用两个指针
i
和j
分别遍历g
和s
。 - 在每一步中,如果当前饼干的尺寸
s[j]
不满足当前孩子的胃口g[i]
,则继续检查下一个饼干。 - 一旦找到满足当前孩子的饼干,就增加计数器
count
,并移动到下一个孩子。 - 最后返回满足的孩子数量
count
。
方案2的解释
- 同样对孩子的胃口值数组
g
和饼干尺寸数组s
进行排序。 - 使用两个指针
child
和cookie
分别遍历g
和s
。 - 在每一步中,如果当前饼干
s[cookie]
可以满足当前孩子g[child]
,则增加满足的孩子数量child
。 - 无论是否满足当前孩子,饼干指针
cookie
都前进。 - 最后返回满足的孩子数量
child
。
比较
- 方案1 使用了
while
循环内的if
判断来跳过不满足的饼干,较为直观。 - 方案2 代码更加简洁,使用
cookie++
代替了while
循环,使得每次都前进饼干指针,减少了循环的复杂度。
从效率上来看,两个方案的时间复杂度都是 O(n log n)(排序) + O(n)(遍历),但方案2的代码更简洁,易于理解和维护。