解法1:用两个优先级队列
思路:
用两个优先级队列,que1和que2分别存储数组g和数组s的元素,用小顶堆的优先级队列,用num来记录满足孩子的数量
用while循环当两个队列中都有元素时,用x和y分别记录两个队列的堆顶元素,比较x和y,当x
<=y时代表,que2.top()的饼干可以分给que1.top()胃口值的孩子,则该胃口值出队que1.pop(),num++,该尺寸饼干也出队que2.pop();如果不满足x<=y,则该胃口值不出队列,只让该尺寸饼干也出队que2.pop(),继续找能满足que1.pop()胃口值的饼干。结束循环,num即为满足孩子的数量。
代码:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int num=0;
priority_queue<int,vector<int>,greater<int>>que1;
priority_queue<int,vector<int>,greater<int>>que2;
for(int i=0;i<g.size();i++){
que1.push(g[i]);
}
for(int i=0;i<s.size();i++){
que2.push(s[i]);
}
while(!que1.empty()&&!que2.empty()){
int x=que1.top();
int y=que2.top();
if(x<=y) {
num++;
que1.pop();
}
que2.pop();
}
return num;
}
};
解法2:用一个优先级队列和排序
思路:
我们可以用一个优先级队列que来存储 胃口值数组g,用小顶堆的优先级队列,用num来记录满足孩子的数量;给数组s用sort排序,然后遍历数组s,比较数组元素与队顶元素,如果s[i]>=que.top(),分配饼干que.top()给第i个孩子,队顶元素出队,满足孩子的数量num++,队列没有元素后,直接结束循环。最后返回num的值即可。
代码:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int num=0;
priority_queue<int,vector<int>,greater<int>>que;
for(int i=0;i<g.size();i++){//把数组g中的元素放入优先级队列
que.push(g[i]);
}
sort(s.begin(),s.end());
for(int i=0;i<s.size();i++){//遍历数组s
if(s[i]>=que.top()){//数组s中的元素大于队列的首元素,队顶元素出队,饼干分配给孩子个i,num++,
que.pop();
num++;
}
if(que.empty()) break;//饼干分完结束循环
}
return num;
}
};