贪心算法3

134. 加油站

  • 全局思考:总油量减去总消耗大于等于零那么一定可以跑完一圈,
  • 局部贪心:累加每个站的净胜油量,如果<0,则在此之前(包括该站)都不是起始位置,从下一个位置开始寻找
cpp 复制代码
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int cursum = 0, totalsum = 0;
        int start = 0;
        for (int i = 0; i < gas.size(); i++) {
            cursum += gas[i] - cost[i];//累加油量净剩量
            totalsum += gas[i] - cost[i];
            if (cursum < 0) {//i位置之前一定不满足
                start = i + 1;//从i下一个位置开始重新寻找
                cursum = 0;
            }
        }
        if (totalsum < 0)//总油量大于消耗的,所以肯定不能跑一圈
            return -1;
        return start;
    }
};

135. 分发糖果

两次遍历

  1. 从左到右,考虑右边比左边大的情况
  2. 从右到左,考虑左边比右边大的情况
cpp 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) {
        int ret = 0;
        vector<int> Candy(ratings.size(), 1);
        for (int i = 1; i < ratings.size(); i++) {
            if (ratings[i - 1] < ratings[i])
                Candy[i] = Candy[i - 1] + 1;
        }
        for (int i = ratings.size() - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1])
                Candy[i] = max(Candy[i], Candy[i + 1] + 1);
        }
        for (int num : Candy)
            ret += num;
        return ret;
    }
};

860. 柠檬水找零

贪心体现在如果支付20美元时,应该优先消耗10美元找零

cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five = 0, ten = 0;
        for (int b : bills) {
            if (b == 5) five++;
            else if (b == 10) five--, ten++;
            else {
                if (ten) ten--, five--;
                else five -= 3;
            }
            if (five < 0) return false;
        }
        return true;
    }
};

406. 根据身高重建队列

首先顾一个维度,按照身高排序,之后优先按身高高的people的k来插入,后序插入节点不会影响前面已经插入的节点

cpp 复制代码
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 pos = people[i][1];
            que.insert(que.begin() + pos, people[i]);
        }
        return que;
    }
};
相关推荐
ajassi20002 小时前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
焦耳加热3 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn3 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6063 小时前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了5 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug5 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠6 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油6 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream6 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL6 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法