贪心算法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;
    }
};
相关推荐
努力学习的小廉29 分钟前
我爱学算法之—— 分治-归并
c++·算法·1024程序员节
Gorgous—l38 分钟前
数据结构算法学习:LeetCode热题100-链表篇(下)(随机链表的复制、排序链表、合并 K 个升序链表、LRU 缓存)
数据结构·学习·算法
仰泳的熊猫39 分钟前
LeetCode:200. 岛屿数量
数据结构·c++·算法·leetcode
流星52112239 分钟前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
sulikey40 分钟前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
defaulter1 小时前
Codeforces Round 1049 (Div. 2)C. Ultimate Value
算法·codeforces
zzzsde1 小时前
【C++】stack和queue:优先级队列的使用及底层原理
开发语言·c++
让我们一起加油好吗1 小时前
【数论】费马小定理
c++·算法·数论·1024程序员节·费马小定理·逆元
大数据张老师2 小时前
数据结构——冒泡排序
数据结构·算法·排序算法·1024程序员节
m0_748233642 小时前
单调队列【C/C++】
c语言·c++·算法·1024程序员节