本题要求分发饼干满足孩子胃口的最大数值,通过贪心算法可知需要让大块饼干满足相对大胃口的孩子的需求才可以求得满足孩子胃口的最大数值。首先,将饼干大小与孩子胃口大小的数组升序排列,而后从后向前遍历,将后面的大块饼干分配给较大胃口的孩子,并对结果进行加一操作。
具体代码如下:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int maxnum=0;
int i=s.size()-1;
for(int j=g.size()-1;j>=0;j--)
{
if(i>=0&&s[i]>=g[j])
{
maxnum++;
i--;
}
}
return maxnum;
}
};
二、leetcode第376题
该题要求摆动子序列的最长长度,也就是将数组画成波形图后求波峰和波谷的数量和,这里涉及到只有波峰或波谷时出现平坡现象和有波峰和波谷时出现平坡现象,这里需要记录前中和中后两个数字的差值进行比较,并对前序差值更新为当前差值。
具体代码如下:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()<=1){return nums.size();}
int prediff=0;
int curdiff=0;
int maxlen=1;
for(int i=0;i<nums.size()-1;i++)
{
curdiff=nums[i+1]-nums[i];
if((prediff>=0&&curdiff<0)||(prediff<=0&&curdiff>0))
{
maxlen++;
prediff=curdiff;
}
}
return maxlen;
}
};
本题要求给定数组的最大子数组的和,这里通过求得局部最优解获得全局最优解,也就是如果当前子数组和为0则重置从下一个数字开始计算,因为当前字数组会对下一个数字的子数组和产生负作用,如果局部子数组的和大于结果值则对结果值进行更新,最终保存的就是最大子数组的和。
具体代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result=INT_MIN;
int count=0;
for(int i=0;i<nums.size();i++)
{
count+=nums[i];
if(count>=result)
{
result=count;
}
if(count<0)
{
count=0;
}
}
return result;
}
};
本文分析了LeetCode中的三个问题:第455题用贪心法分配饼干以满足孩子胃口,第376题计算摆动子序列的最长长度,第53题求解最大子数组和。通过实例展示了如何运用贪心策略解决这些IT算法问题。
1325

被折叠的 条评论
为什么被折叠?



