代码随想录算法训练营第三十五天 | 860. 柠檬水找零, 406.根据身高重建队列,452. 用最少数量的箭引爆气球

860. 柠檬水找零
自己的想法是由于顾客支付的只有5美元或者10美元或者20美元,显然支付5美元时不用找零;而支付10美元时需要找5美元,因此需要判断目前是否有5美元;而支付20美元时需要找15美元,因此需要判断目前是否有3张5美元或者1张10美元、1张5美元。我做这道题目时并没有一次性通过,原因就是支付20美元找零时,要先判断是否有1张10美元、1张5美元,之后再判断是否有3张5美元,顺序不可以调换哦,因为10美元只能用于20美元找零,而5美元可以用于10美元或者20美元找零。

bool lemonadeChange(int* bills, int billsSize){
    int i, p, q;
    p = q = 0;
    printf("billsSize = %d", billsSize);
    for (i = 0; i < billsSize; i++){
        if (bills[i] == 5){
            p++;
        }
        else if (bills[i] == 10){
            if (p == 0){
                printf("hello\n");
                return false;
            }
            q++;
            p--;
        }
        else if (bills[i] == 20){
            if (p > 0 && q > 0){
                p--;
                q--;
            }
            else if (p >= 3){
                p -= 3;
            }
            else {
                printf("i = %d, p = %d, q = %d\n", i, p, q);
                printf("hey\n");
                return false;
            }
        }
        
    }

    return true;
}

406. 根据身高重建队列
没有什么想法的样子。
先按照身高维度先处理,然后再处理前面有几个人比当前这个人高。
大致理解了思路,实现还是有困难。

452. 用最少数量的箭引爆气球
重叠区间的题目,题目都看不懂,难过。

要努力啊!

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