天天看點

Leetcode455. 分發餅幹(C語言)Leetcode455. 分發餅幹(C語言)

Leetcode455. 分發餅幹(C語言)

算法-貪心思想:算法與資料結構參考

題目:

假設你是一位很棒的家長,想要給你的孩子們一些小餅幹。但是,每個孩子最多隻能給一塊餅幹。

每個孩子 i 都有一個胃口值 gi ,這是能滿足孩子胃口的餅幹最小尺寸;

每塊餅幹 j ,都有一個尺寸 sj 。

如果 sj >= gi ,可将餅幹 j 配置設定給孩子 i ,孩子會得到滿足。盡可能滿足越多數量的孩子,并輸出這個最大數值。例:

輸入: [1,2], [1,2,3]

輸出: 2

解釋:

你有兩個孩子和三塊小餅幹,2個孩子的胃口值分别是1,2。

你擁有的餅幹數量和尺寸都足以讓所有孩子滿足。是以輸出2。

思路:

先分别按孩子胃口給孩子排序,餅幹大小給餅幹排序。

若餅幹j能滿足孩子i,則count計數,否則餅幹後移一個繼續比較(更大尺寸)。

可直接調用c語言自帶的快速排序函數qsort:

函數聲明:

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

參數:

base-- 指向要排序的數組的第一個元素的指針。

nitems-- 由 base 指向的數組中元素的個數。

size-- 數組中每個元素的大小,以位元組為機關。

compar-- 用來比較兩個元素的函數,即函數指針(回調函數)

compar參數指向一個比較兩個元素的函數,必須是const void *型,compar實質為函數指針,這裡稱它所指向的函數也為compar。在compar函數内部會将const void *型轉換成實際類型。
int compar(const void *p1, const void *p2);
  如果compar傳回值小于0(< 0),那麼p1所指向元素會被排在p2所指向元素的左面;
  如果compar傳回值等于0(= 0),那麼p1所指向元素與p2所指向元素的順序不确定;
  如果compar傳回值大于0(> 0),那麼p1所指向元素會被排在p2所指向元素的右面。
           

代碼:

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(g[0]),cmp);
    qsort(s,sSize,sizeof(s[0]),cmp);
    
    int i=0,j=0,count=0;
    while(i<gSize && j<sSize){
        if(g[i]>s[j])   j++;
        else{
            count++;
            i++;
            j++;
        }
    }
    
    return count;
}
           

繼續閱讀