leetcode 力扣 455.分发饼干

题目描述:

leetcode 力扣 455.分发饼干_第1张图片


解题方法:

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语言自带的快速排序函数,它的头文件是

函数声明:

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.调用函数的问题:

在调用函数时一定要在函数后加上(),告诉编译器你正在调用函数

你可能感兴趣的:(leetcode,算法,c语言)