题目:134. 加油站
思路
贪心法;
代码
暴力法
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int i, rest, index, size;
size = gas.size();
for(i = 0; i < size; i++)
{
// 从 i 开始
// 油量储备
rest = gas[i] - cost[i];
index = (i + 1) % size;
// 有油且未到达终点
while(rest > 0 && index != i)
{
rest = rest + gas[index] - cost[index];
index = (index + 1) % size;
}
if(rest >= 0 && index == i)
{
return i;
}
}
return -1;
}
};
本题应该设置了时长限制,所以暴力法超时了;
贪心 Method 1
// 代码随想录: 贪心 Method 1
//
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int min = INT_MAX; // 从起点出发,邮箱里的油量最小值
int i, rest;
for(i = 0; i < gas.size(); i++)
{
cout << "i : " << i;
rest = gas[i] - cost[i]; // 这一天剩下的油
curSum += rest; // 现在的油
cout << ", curSum : " << curSum;
if(curSum < min)
{
min = curSum;
}
}
// 情况1:跑不了一圈
if(curSum < 0)
{
return -1;
}
// 情况2:
if(min >= 0)
{
return 0;
}
for(i = gas.size()-1; i >= 0; i--)
{
rest = gas[i] - cost[i];
min += rest;
if(min >= 0)
{
return i;
}
}
return -1;
}
};
贪心 Method 2
// 贪心 Method 2
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int i;
int totalsum = 0, cursum = 0, start = 0;
for(i = 0; i < gas.size(); i++)
{
cout << ", i : " << i;
cursum += gas[i] - cost[i];
totalsum += gas[i] - cost[i];
cout << ", cursum : " << cursum;
// 没油了, 重来
if(cursum < 0)
{
start = i+1; // 题目条件有“如果有解存在唯一解”
cursum = 0;
cout << ", start : " << start;
}
cout << endl;
}
// 没戏了
if(totalsum < 0)
{
return -1;
}
return start;
}
};
看不懂代码的时候,就手动输出调试;(像上面那样)