贪心算法(例题详解)

贪心算法-原理拆解

1、根据当前情况,做出一步最佳选择

2、做出选择后,永不改变,永不反悔!(有些算法比如回溯算法,会反悔)

3、如此循环,用局部最优解,逐步得到整体最优解

例题理解

用简单的案例,理解最深刻的思想。

样例:

贪心算法思路:

1、首先,我们看到这两组数据,我们想通过贪心算法解决此题,达到每一步都是最优解的目的,我们第一件事想到应该是将这两组数据排序,为了代码就简单清晰,我们可以直接使用qsort函数。 

qsort函数:

 qsort 是 C 标准库(include<stdlib.h>)中提供的一个函数,用于对数组进行快速排序。它的函数原型如下:

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));  

参数说明:

  1. base: 待排序数组的首地址。因为是 void * 类型,函数可以处理任何类型的数组。

  2. num: 数组中元素的数量。

  3. size: 每个元素的大小(以字节为单位)。

  4. compar: 一个比较函数的指针,该函数用于决定两个元素的顺序。它的原型通常如下:

int compar(const void *a, const void *b);  
  • 返回负数表示 a 小于 b

  • 返回零表示 a 等于 b

  • 返回正数表示 a 大于 b

2、使用双指针的方法进行挑选出每一步的最优解,可以选择每一个孩子去遍历每一块饼干,或者每一块饼干去遍历每一个孩子。将一个大整体拆分成很多个一小部分,每一步都是最优解,从而达到整个大整体都是最优解,这就是贪心算法的核心思想。

注意:满足的最大数值是不能超过饼干数的! 

核心思路代码:

int cmp(int *a,int* b)
{
    return *a - *b;//qsort的辅助函数
}
int findContentChildren(int* g, int gSize, int* s, int sSize) {  
    int flag = 0;  
    //排序
    qsort(g,gSize,sizeof(int),cmp);
    qsort(s,sSize,sizeof(int),cmp);
    for(int i=0,j=0;i<sSize&&j<gSize;i++,j++)
    {
        while(i<sSize && g[j]>s[i])
        {
            i++;
        }
        if(i<sSize)
        {
            flag++;
        }
    }
    return flag;
            
}

该代码原创是力扣官方,我原本的思路是在找到那个最合适的饼干后,则该孩子应该t出数组,我使用的方法是将这个孩子上对应的数值更改为很大很大,虽然最后也通过了,但是我认为这样的方式行不通,所以最终借鉴了力扣官方的题解代码。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值