题目描述:
解题方法:
1.双指针法:
我们在排序后用两个指针指向两个数组,从胃口最小的孩子开始,在一个孩子吃到饼干之后,两个指针都向右移动,让下一个孩子开始吃饼干。如果饼干尺寸小于孩子的最小胃口,j指针向右移动,换一块更大的饼干,思路简单
代码:
int com(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), com);
qsort (s, sSize, sizeof(int), com);
int i = 0,j = 0,k,temp,flag = 0;
while(i < gSize && j < sSize)
{
if(g[i] <= s[j])
{
i++;
j++;
flag++;
}
else
{
j++;
}
}
return flag;
}
运行结果:
2. 快排+贪心算法:
在这种类型求最优解的问题里,贪心算法是最为常见的解法,在这道题里面为了满足更多孩子的胃口,我们应该优先满足胃口小的孩子,我们可以先调用C语言的快排函数把孩子的胃口和食物数量的多少从小到大排序,再用贪心的方法把饼干进行分配
代码:
int com(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), com);
qsort(s, sSize, sizeof(int), com);
int i,j;
int count=0;
for(i=0,j=0;i<gSize&&j<sSize;i++,j++)
{
while(j<sSize&&g[i]>s[j])
{
j++;
}
if(j<sSize)
{
count++;
}
}
return count;
}
运行结果:
知识点:
1.qsort()函数:
qsort()是C语言自带的快速排序函数,它的头文件是<stdlib.h>
函数声明:
void qsort (void* base, size_t num, size_t size,int (*com)(const void*,const void*))
函数参数:
第一个参数是首元素地址base;第二个参数是元素个数num;第三个参数是元素大小size;第四个参数 自定义比较函数com
com参数:
int com(const void * a,const void * b)
{
return *(int*)a - *(int*)b;
}
com()函数是qsort()函数排序的核心内容,它的功能是比较两个函数的大小,传入两个const void 型的参数,返回值为正则a大,那么b的值排在前,返回值为负则b大,则a的值排在前,但当a=*b时,他们的前后关系无法确定,这也是qsort()函数的缺陷
2.sizeof()函数:
sizeof()函数可以求出元素占用存储空间的字节数
3.函数传入的是形参:
例如题目中用到的com()函数,如果想把函数中对数值的改变应用到整个主函数里,那就应该传入变量的指针并且通过指针对元素的值进行修改
4.调用函数的问题:
在调用函数时一定要在函数后加上(),告诉编译器你正在调用函数