本文主要是介绍代码随想录算法训练营第二十七天|leetcode53、376、455题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、leetcode第455题
本题要求分发饼干满足孩子胃口的最大数值,通过贪心算法可知需要让大块饼干满足相对大胃口的孩子的需求才可以求得满足孩子胃口的最大数值。首先,将饼干大小与孩子胃口大小的数组升序排列,而后从后向前遍历,将后面的大块饼干分配给较大胃口的孩子,并对结果进行加一操作。
具体代码如下:
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;}
};
三、leetcode第53题
本题要求给定数组的最大子数组的和,这里通过求得局部最优解获得全局最优解,也就是如果当前子数组和为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;}
};
这篇关于代码随想录算法训练营第二十七天|leetcode53、376、455题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!