day27 贪心算法

1.什么是贪心?
比如10张钞票,有1,5,20,100等面额,取五张,如何取得到数额最多的钱?每次取面额最大的那张钞票;就是每个阶段的局部最优;全局最优就是最后拿到的钞票数最大;局部最优推出全局最优;
题目描述
day27 贪心算法_第1张图片

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(int),cmp);
    qsort(s,sSize,sizeof(int),cmp);
    int right1 = gSize-1;
    int right2 = sSize-1;
    int count = 0;//记录投喂的孩子
    while(right1 >= 0 && right2 >= 0)
    {
        if(s[right2] >= g[right1])
        {
            count++;
            right1--;
            right2--;
        }
        else
        {
            right1--;
        }
    }
    return count;
}

题目描述
day27 贪心算法_第2张图片

int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){

    // 下标 0  1  2  3  4
    // gas  1  2  3  4  5
    // cos  3  4  5  1  2
    // cur -2 -2 -2  4  3 (净增) 如果是负数,不可能走完一圈只能从下标3(不是负数)开始才能跑完一圈
    int cur = 0; //每一站剩余的油量
    int totalSum = 0;//所有剩余油量之和 < 0 不可能跑完一圈
    int start = 0;// 记录cur不是负数的下标
    for(int i = 0;i< gasSize;i++){
        cur += (gas[i] - cost[i]);
        totalSum += (gas[i] - cost[i]);
        if(cur < 0){
            start = i+1;
            cur = 0;//新起点,剩余油量归0.重新统计
        }
    }
    if (totalSum < 0){
        return -1;
    }
    return start;
}

你可能感兴趣的:(贪心算法,算法)