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. 根据身高重建队列
涉及两个维度的操作, 需要分开解决