贪心算法-原理拆解
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 *));
参数说明:
-
base: 待排序数组的首地址。因为是
void *
类型,函数可以处理任何类型的数组。 -
num: 数组中元素的数量。
-
size: 每个元素的大小(以字节为单位)。
-
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出数组,我使用的方法是将这个孩子上对应的数值更改为很大很大,虽然最后也通过了,但是我认为这样的方式行不通,所以最终借鉴了力扣官方的题解代码。