今日收获:加油站,分发糖果,柠檬水找零,根据身高重建队列
1. 加油站
题目链接:134. - 力扣(LeetCode)
思路:
(1)局部最优是剩余油量和要大于0,否则选下一个节点作为起始节点
(2)记录当前剩余油量和总的剩余油量,如果当前剩余油量小于0,选择下一个节点作为起点。思路有点像最大子序和;如果总的剩余油量小于0,说明无解
方法:
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int len=gas.length;
int totalSum=0;
int curSum=0;
int start=0;
for (int i=0;i<len;i++){
curSum+=gas[i]-cost[i];
totalSum+=gas[i]-cost[i];
if (curSum<0){ // 选择下一个节点开始
start=i+1;
curSum=0;
}
}
if (totalSum<0){ // 无解
return -1;
}
return start;
}
}
总结:
(1)如果用暴力法将每个节点作为起始节点试一遍,for适合从头到尾的遍历,while适合模拟循环遍历
(2)对于包装过的场景题,要抽象成数据结构问题,不