134. 加油站

一、暴力法

从每个加油站开始模拟是否能跑完一圈
for循环遍历每个加油站,while循环模拟跑一圈

  1. class Solution {
  2. public:
  3. int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
  4. for(int i=0;i<cost.size();i++)
  5. {
  6. //初始化第一个加油站的剩余油量
  7. int rest = gas[i]-cost[i];
  8. int index = (i+1)%cost.size();
  9. while(rest>0&&index!=i)
  10. {
  11. rest += gas[index]-cost[index];
  12. index = (index+1)%cost.size();
  13. }
  14. //index==i说明跑完了一圈
  15. if(rest>=0&&index==i)return i;
  16. }
  17. return -1;
  18. }
  19. };

二、贪心

image.png
用currest记录当前的汽油剩余量,若小于0,说明当前位置不能作为起始位置,将当前位置的下一位置作为start
totalrest用于记录跑完一圈剩余的油量,若小于0,说明不可能跑完。

  1. class Solution {
  2. public:
  3. int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
  4. int currest = 0;
  5. int totalrest = 0;
  6. int start = 0;
  7. for(int i=0;i<gas.size();i++)
  8. {
  9. currest += gas[i]-cost[i];
  10. totalrest += gas[i]-cost[i];
  11. if(currest<0)
  12. {
  13. start = i+1;
  14. currest=0;
  15. }
  16. }
  17. if(totalrest<0)return -1;
  18. return start;
  19. }
  20. };