【代码随想录】刷题笔记Day37

前言

  • 试一试早上+晚上固定时间刷题会不会效率and养成习惯

135. 分发糖果 - 力扣(LeetCode)

  • 两边一起判断容易顾此失彼
  • 从左到右遍历,只比较右比左大的情况,局部and全局:右比左大
  • 从右到左遍历,只比较左比右大的情况,局部and全局:左比右大
  • 取两次遍历得到的最大值,局部and全局:比左右都大
  • 【代码随想录】刷题笔记Day37_第1张图片
  • class Solution {
    public:
        int candy(vector& ratings) {
            vector candyVec(ratings.size(), 1);
            // 从前向后
            for (int i = 1; i < ratings.size(); i++) {
                if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
            }
            // 从后向前
            for (int i = ratings.size() - 2; i >= 0; i--) {
                if (ratings[i] > ratings[i + 1] ) {
                    candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
                }
                // 也可以用更新的策略
                // if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1]) {
                //     candies[i] = candies[i + 1] + 1;
                // }
            }
            // 统计结果
            int result = 0;
            for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];
            return result;
        }
    };

860. 柠檬水找零 - 力扣(LeetCode) 

  • 这题模拟就行,唯一需要贪心的就是20的时候优先找10+5,而不是5+5+5
  • class Solution {
    public:
        bool lemonadeChange(vector& bills) {
            int five = 0, ten = 0, twenty = 0;
            for(int i = 0; i < bills.size(); i++){
                if(bills[i] == 5){
                    five++;
                }else if(bills[i] == 10){
                    if(five <= 0) return false;
                    ten++;
                    five--;
                }else if(bills[i] == 20){  // 实际不用维护twenty的数,找不出去
                    if(ten >= 1 && five >= 1){  // 优先消耗5+10
                        ten--;five--;
                    } else if(ten <= 0 && five >= 3) five-= 3;
                    else return false; 
                }
            }
            return true;
        }
    };

406. 根据身高重建队列 - 力扣(LeetCode)

  • 双端遍历,要领是第二遍不影响第一遍确定好的符合题目意思的排序(类似分发糖果)
  • 先按照h从大到小排(相同则k从小到大),再根据k的值进行插入(不影响其他符合题意)
  • 【代码随想录】刷题笔记Day37_第2张图片
  • // 用vector效率低,链表效率高
    class Solution {
    public:
        static bool cmp(const vector& a, const vector b){
                if(a[0] == b[0]) return a[1] < b[1];
                return a[0] > b[0];
        }
        vector> reconstructQueue(vector>& people) {
            vector> reQueue;
            // list> que; // list底层是链表实现,插入效率比vector高的多
            sort(people.begin(), people.end(), cmp);
            for(int i = 0; i < people.size(); i++){
                int pos = people[i][1];
                reQueue.insert(reQueue.begin() + pos, people[i]);
                // 链表插入比容器数组效率高,但是没有随机访问功能,只能遍历找插入位置
                // std::list>::iterator it = reQueue.begin();
                // while (pos--) { // 寻找插入位置
                //     it++;
                // }
                // reQueue.insert(it, people[i]);
            }
            return reQueue;
            // return vector>(reQueue.begin(), reQueue.end());
        }
    };

后言

  • 还是折腾到下午了,感觉早上的2小时还是不太够啊,来不及呀来不及~ 

你可能感兴趣的:(代码随想录刷题笔记,笔记,leetcode,数据结构,算法,职场和发展)