1.什么是贪心?
比如10张钞票,有1,5,20,100等面额,取五张,如何取得到数额最多的钱?每次取面额最大的那张钞票;就是每个阶段的局部最优;全局最优就是最后拿到的钞票数最大;局部最优推出全局最优;
题目描述
int cmp(const void *a,const void *b)
{
return *(int *)(a) - *(int *)(b);
}
int findContentChildren(int* g, int gSize, int* s, int sSize){
// 找最大的饼干去喂胃口最大的孩子 这样不会浪费
// 两个数组进行排序
qsort(g,gSize,sizeof(int),cmp);
qsort(s,sSize,sizeof(int),cmp);
int right1 = gSize-1;
int right2 = sSize-1;
int count = 0;//记录投喂的孩子
while(right1 >= 0 && right2 >= 0)
{
if(s[right2] >= g[right1])
{
count++;
right1--;
right2--;
}
else
{
right1--;
}
}
return count;
}
题目描述
文章来源:https://www.toymoban.com/news/detail-573134.html
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
// 下标 0 1 2 3 4
// gas 1 2 3 4 5
// cos 3 4 5 1 2
// cur -2 -2 -2 4 3 (净增) 如果是负数,不可能走完一圈只能从下标3(不是负数)开始才能跑完一圈
int cur = 0; //每一站剩余的油量
int totalSum = 0;//所有剩余油量之和 < 0 不可能跑完一圈
int start = 0;// 记录cur不是负数的下标
for(int i = 0;i< gasSize;i++){
cur += (gas[i] - cost[i]);
totalSum += (gas[i] - cost[i]);
if(cur < 0){
start = i+1;
cur = 0;//新起点,剩余油量归0.重新统计
}
}
if (totalSum < 0){
return -1;
}
return start;
}
题目描述
分析:摆动序列,就是前后相减保证一正一负;对于复杂的序列,比如:1,17,5,10,13,15,10,5,16,8
对于这种,我们只需要记录坡顶和坡底元素;中间的10,13,10可以忽略;
prediff = nums[i] - nums[i-1]; 表示前一个坡度;
curdiff = nums[i+1] - nums[i];;表示后一个坡度;
如果 prediff 和 curdiff 一正一负(prediff > 0 && curdiff < 0 || prediff < 0 && curdiff > 0)表示找到了一个峰值;计数++;
细节分析:
1)上下坡有平坡:1 2 2 2 1 摆动长度应该是3 (1 2 1)前面加上prediff 或者 curdiff 加等于号即可(prediff > =0 && curdiff < 0 || prediff < = 0 && curdiff > 0);
2)首尾元素,首尾元素默认都算,但是长度为2的时候,需要前面加一个元素,使有prediff,符合我们上面判断逻辑;末尾元素我们当作是一个摆动,所以res = 1,就是末尾的一个;
3)单调有平坡 1 2 2 4 5 只有两个摆动
每次找到摆动数后,prediff = curdiff ;prediff向前移动;文章来源地址https://www.toymoban.com/news/detail-573134.html
int wiggleMaxLength(int* nums, int numsSize){
int res = 1;
if (numsSize == 1) {
return res;
}
int prediff = 0; // nums[i] - nums[i-1]
int curdiff = 0; // nums[i+1] - nums[i]
for (int i = 0;i < numsSize - 1;i++) {// i遍历到倒数第二个
curdiff = nums[i+1] - nums[i];
if ((prediff >= 0 && curdiff < 0) || (prediff <= 0 && curdiff > 0)){
res++;
prediff = curdiff;// 只记录变化的坡度,遇到摆动,记录下一个坡,就是遇到平坡不会记录
}
}
return res;
}
到了这里,关于day27 贪心算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!