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

前言

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

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

  • 两边一起判断容易顾此失彼
  • 从左到右遍历,只比较右比左大的情况,局部and全局:右比左大
  • 从右到左遍历,只比较左比右大的情况,局部and全局:左比右大
  • 取两次遍历得到的最大值,局部and全局:比左右都大
cpp 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> 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
cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& 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的值进行插入(不影响其他符合题意)
cpp 复制代码
// 用vector效率低,链表效率高
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) {
        vector<vector<int>> reQueue;
        // list<vector<int>> 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<vector<int>>::iterator it = reQueue.begin();
            // while (pos--) { // 寻找插入位置
            //     it++;
            // }
            // reQueue.insert(it, people[i]);
        }
        return reQueue;
        // return vector<vector<int>>(reQueue.begin(), reQueue.end());
    }
};

后言

  • 还是折腾到下午了,感觉早上的2小时还是不太够啊,来不及呀来不及~
相关推荐
HAPPY酷1 分钟前
Python高级架构师之路——从原理到实战
java·python·算法
枫叶林FYL15 分钟前
第9章 因果推理与物理理解
人工智能·算法·机器学习
小白zlm34 分钟前
预畸变双线性变换
单片机·嵌入式硬件·算法·电机控制
wuweijianlove1 小时前
算法复杂度估算的实验建模与可视化表达的技术6
算法
执笔画流年呀1 小时前
7大排序算法
java·算法·排序算法
AI成长日志1 小时前
【算法学习专栏】动态规划基础·中等两题精讲(198.打家劫舍、322.零钱兑换)
学习·算法·动态规划
计算机安禾1 小时前
【数据结构与算法】第28篇:平衡二叉树(AVL树)
开发语言·数据结构·数据库·线性代数·算法·矩阵·visual studio
测试_AI_一辰1 小时前
AI 如何参与 Playwright 自动化维护:一次自动修复闭环实践
人工智能·算法·ai·自动化·ai编程
tq10861 小时前
价值:社会对劳动所产生的效用增量形成的局部共识
笔记
未来之窗软件服务2 小时前
算法设计—计算机等级考试—软件设计师考前备忘录—东方仙盟
算法·软件设计师·计算机等级考试