LeetCode455. 分发饼干
题目链接:455. 分发饼干 - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干_哔哩哔哩_bilibili
思路:首先给两个数组从小到大排序,然后大的饼干喂给能满足的最大的孩子。
代码:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int count=0;
int index=s.size()-1;
for(int i=g.size()-1;i>=0;i--){
if(index>=0&&s[index]>=g[i]){
count++;
index--;
}
}
return count;
}
};
LeetCode376. 摆动序列
题目链接:376. 摆动序列 - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列_哔哩哔哩_bilibili
思路:这道题我们只取摆动的波峰和波谷的值,不需要取途径的值,大概思路是算一下当前数和前一个数的差即为prediff,和下一个数的差计为curdiff,他们两个必须一个大于0,一个小于0才加入计数。为了处理会出现平着的特殊情况,我们使得prediff可以为0,也加入计数。此外还有一种情况,那么就是单调升或降但是出现平的情况,会导致result多计入一个,这种情况的出现,我们可以让prediff只有在result++的时候才改变,也就是符合上面情况的时候才改变prediff。
代码:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()<=1){
return nums.size();
}
int curdiff=0;
int prediff=0;
int result=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)){
result++;
prediff=curdiff;
}
}
return result;
}
};
LeetCode53. 最大子数组和
题目链接:53. 最大子数组和 - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和_哔哩哔哩_bilibili
思路:这道题的思路就是,如果累加和为负数,我们于是抛弃这个累加和,从下一个数开始累加,前面的累加和会给后面带来负面的影响,所以直接从后面开始累加,与此同时始终记录累加和的最大值。
代码:
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;
}
};