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


    860.柠檬水找零

    思路

    代码

    class Solution {
    public:
        bool lemonadeChange(vector<int>& bills) {
            int FiveSum = 0;
            int TenSum = 0;
    
            for(int i = 0; i < bills.size(); i++) {
                if(bills[i] == 5) {
                    FiveSum++;
                }
                if(bills[i] == 10 ) {
                    if(FiveSum > 0 ) {
                        FiveSum--;
                        TenSum++;
                    }
                    else{
                        return false;
                    }
                } 
    
                if(bills[i] == 20) {
                    if (FiveSum > 0 && TenSum > 0) {
                        FiveSum--;
                        TenSum--;
                    }
                    else if (FiveSum >= 3 && TenSum <= 0) {
                        FiveSum = FiveSum - 3;
                    }
                    else {
                        return false;
                    }
                } 
            }
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    总结

    1. 写的时候很顺利,其实没想到这么多。看完题解才明白为什么一定要这样写
    2. 因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!
      所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

    406.根据身高重建队列

    思路

    【一开始没读懂题】这是一个关于重新构造队列的问题,需要根据给定的人员属性重新排列队列。

    题目中给出了一个数组 people,其中每个元素表示队列中的一个人的属性,包括身高 hi 和前面大于或等于他身高的人数 ki。数组中的元素不一定按照队列中的顺序排列。

    简单来说,people 数组是乱序的,让大家根据 people[i] 的 hi 和 ki 对 people 进行重排序,让重排序后的 people[i] 所在的位置符合 ki 描述的“前面有几个人比他高”这个条件。

    本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。

    局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

    全局最优:最后都做完插入操作,整个队列满足题目队列属性

    代码

    class Solution {
    public:
        static bool cmp(const vector<int>& a, const vector<int>& b) {
            if(a[0] == b[0]) return a[1] < b[1];
            return a[0] > b[0];
        }
        vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
            sort(people.begin(), people.end(),cmp);
            vector<vector<int>> que;
            for(int i = 0; i < people.size(); i++) {
                int position = people[i][1];
                que.insert(que.begin() + position, people[i]);
            }
            return que;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    总结

    1. 注意选择的数据结构对算法性能的影响

    452. 用最少数量的箭引爆气球

    思路

    代码

    class Solution {
    public:
        static bool cmp(const vector<int>& a, const vector<int>& b) {
            return a[0] < b[0];
        }
        int findMinArrowShots(vector<vector<int>>& points) {
            // int result = 0;
            // int cover = 0;
            // sort(points.begin(), points.end(), cmp);
            
            // for (int i = 0; i < points.size(); i++) {
            //     cover = max(points[i][1] + i, cover); // 找到覆盖范围
            //     if(points[i][1] <= cover) {
            //         continue;
            //     }
            //     else {
            //         result++;
            //     }
            // }
            // return result;
    
            if(points.size() == 0) return 0;
            sort(points.begin(), points.end(), cmp);
    
            int result = 1;
            for (int i = 1; i < points.size(); i++) {
                if(points[i][0] > points[i-1][1]) {
                    result++;
                }
                else {
                    points[i][1] = min(points[i-1][1], points[i][1]);
                }
            }
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    总结

    1. 思路是对的,但是写起来就不行了,还是要多练!!!!
  • 相关阅读:
    Verilog:【3】边沿检测器(edge_detect.sv)
    平台H5对接支付宝支付接口(含分布式源码)
    零基础入门学习Web开发:HTML篇(一)
    Java数据结构-哈希表
    【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作
    2、宽带Doherty放大器ADS仿真(带版图)
    Android 使用Kotlin封装RecyclerView
    PYTHON第一次
    3年Java经验,这份大厂面试进阶手册帮我重新梳理了职业生涯
    C语言:结构体——关于内存字节对齐图文详解
  • 原文地址:https://blog.csdn.net/Hireath_/article/details/130828412