【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
LeetCode题目链接
https://leetcode.cn/problems/gas-station/description/
https://leetcode.cn/problems/candy/description/
https://leetcode.cn/problems/lemonade-change/description/
https://leetcode.cn/problems/queue-reconstruction-by-height/description/
题解
134.加油站
暴力写法通过了,我就掌握暴力写法吧。题目可能还没看懂。暴力解法也要注意索引值以及对于题目解释案例的变通之处。比如计算rest的方法。
135.分发糖果
思路还记得,就记得要从前向后和从后向前两种遍历方式,但糖果的加法完全忘了,其实两种遍历分别是两种不同的解法,尤其是第二种。
860.柠檬水找零
记得思路,基本上写的和题解是一样的。
406.根据身高重建队列
考虑两个维度,一定要先确定好一个维度再看下一个维度。
代码里注意sort的写法,空vector插入的写法,两个语法问题。(保证一定是从位置0开始插入?)
代码
//134.加油站
//135.分发糖果
//860.柠檬水找零
#include <iostream>
#include <vector>
#include <map>
using namespace std;class Solution {
public:bool lemonadeChange(vector<int>& bills) {map<int, int> mp;for (int i = 0;i < bills.size();i++) {if (bills[i] == 5) {mp[5]++;}else if (bills[i] == 10) {mp[10]++;mp[5]--;if (mp[5] < 0) return false;}else {if (mp[10] > 0 && mp[5] > 0) {mp[20]++;mp[10]--;mp[5]--;}else if (mp[5] >= 3) {mp[20]++;mp[5] -= 3;}else {return false;}}}return true;}
};int main() {Solution s;vector<int> nums1 = { 5,5,5,10,20 }, nums2 = { 5,5,10,10,20 };printf("%d", s.lemonadeChange(nums2));return 0;
}
//406.根据身高重建队列