134. 加油站-----O(N)遍历发法

本文介绍了一种解决加油站问题的有效算法,关键在于确保总油量大于等于总消耗,并通过curr变量判断从哪个加油站开始能顺利绕一圈。算法首先计算所有加油站的油量与消耗之差,若累计油量小于0,则更新起始加油站并清零累计油量。

解法思路来源

中心是抓住 sum(gas)一定 >= sum(cost) 才能跑完这一点来完成的
但是 加入了一个curr 来 选当前站点是否可以走完循环 如果cur< 0 则不可以 ,接着讲start 替换即可

class Solution {
  public int canCompleteCircuit(int[] gas, int[] cost) {
    int n = gas.length;

    int total_tank = 0;
    int curr_tank = 0;

    int start = 0;
    for (int i = 0; i < n; ++i) {
      total_tank += gas[i] - cost[i];
      
      curr_tank += gas[i] - cost[i];
     
      if (curr_tank < 0) {
        
        start = i + 1;
        
        curr_tank = 0;
      }
    }
    return total_tank >= 0 ? start : -1;
  }
}


在使用动态规划算解决最少加油次数问题时,核心思想是通过状态定义和状态转移来逐步求解最优方案。以下是一个详细的解释。 ### 动态规划方分析 1. **问题建模**: - 假设汽车从起点出,加满油可以行驶一定距离(如 `car` 千米)。 - 给定一系列加油站之间的距离数组 `weight` 和对应的加油站编号数组 `gasNumber`。 - 目标是找到一种方案,使得中途加油的次数最少。 2. **状态定义**: 使用一个一维数组 `dp[i]` 表示到达第 `i` 个加油站时所需的最少加油次数。初始条件为 `dp[0] = 0`,因为从起点出时无需加油。 3. **状态转移**: 对于每一个加油站 `i`,需要判断是否可以在不加油的情况下从上一个加油站 `i-1` 到达当前加油站 `i`。如果不能,则需要在前一个加油站加一次油,并更新状态转移方程: $$ dp[i] = \begin{cases} dp[i-1] & \text{if } weight[i] + weight[i-1] \leq car \\ dp[i-1] + 1 & \text{otherwise} \end{cases} $$ 4. **边界条件处理**: 如果某个路段的距离超过汽车的最大续航能力,则直接返回错误提示,表示无完成行程。 ### 示例代码实现 ```cpp #include <iostream> using namespace std; const int car = 10; // 汽车加满油后的续航里程 void travel(int gasNumber[], int weight[], int count) { if (car < weight[0]) { cout << "汽车续航太差,加满油都无到达下一个加油站。" << endl; return; } int dp[count]; dp[0] = 0; // 初始状态 for (int i = 1; i < count; i++) { if (weight[i] > car) { cout << "无到达第 " << i + 1 << " 个加油站,距离过远。" << endl; return; } if (weight[i] + weight[i - 1] > car) { dp[i] = dp[i - 1] + 1; } else { dp[i] = dp[i - 1]; weight[i] += weight[i - 1]; // 累加距离 } } cout << "最少需要加油的次数为: " << dp[count - 1] << endl; } int main() { int gasNumber[4] = {1, 2, 3, 4}; // 加油站编号 int weight[4] = {5, 6, 2, 9}; // 各段距离 int count = sizeof(gasNumber) / sizeof(int); travel(gasNumber, weight, count); return 0; } ``` ### 核心逻辑解析 1. **初始化**:设置起始点到第一个加油站的距离为原始值,并检查是否可以直接到达第一个加油站。 2. **遍历加油站**:逐个计算每个加油站的状态 `dp[i]`,根据是否需要加油进行更新。 3. **输出结果**:最终输出到达终点所需的最少加油次数。 ### 复杂度分析 - **时间复杂度**:`O(n)`,其中 `n` 是加油站的数量。仅需遍历一次所有加油站即可完成状态转移。 - **空间复杂度**:`O(n)`,用于存储每个加油站的最少加油次数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值