134. 加油站
参考
思路:
- 以每个油站相差作为判断, 比如:
- gas [5 8 2 8]
- cost [6 5 6 6]
-
[-1 3 -4 2]
- 错误 : 把相差最大点当作起点
- 判断能否绕一圈 : 相加数组是否小于0
- 局部最优: 当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行
- 全局最优: 找到可以跑一圈的起始位置
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {vector<int> diff(gas.size(), 0);int sum = 0;for (int i = 0; i < gas.size(); i++) {diff[i] = gas[i] - cost[i];sum += diff[i];}if (sum < 0) return -1;sum = 0;int pos = 0;for (int i = 0; i < diff.size(); i++) {sum += diff[i];if (sum < 0) {sum = 0;pos = i + 1;}}return pos;}
};
暴力解法
135. 分发糖果
- 情况1: 右边小孩比左边大
- ratings[i - 1] < ratings[i], 则 candy[i] = candy[i - 1] + 1
- 情况2: 左边小孩比右边大
860.柠檬水找零
思路: 分清楚三种情况
- 5 , 直接收下
- 10, 找零 5
- 20, 找零 3个5 或10+5
20时要分情况, 但优先使用10+5来找零
class Solution {
public:bool lemonadeChange(vector<int>& bills) {vector<int> count(3, 0); // 5 10 20 的数量for (int i = 0; i < bills.size(); i++) {if (bills[i] == 5)count[0]++;if (bills[i] == 10) {count[1]++;count[0]--;}if (bills[i] == 20) {count[2]++;if (count[1] > 0) {count[1]--;count[0]--;} else {count[0] -= 3;}}if (count[0] < 0)return false;}return true;}
};
406. 根据身高重建队列
涉及两个维度的操作, 需要分开解决