[Java·算法·中等] LeetCode274. H指数 详细解读

简介: [Java·算法·中等] LeetCode274. H指数 详细解读

题目

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gascost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

示例

示例1

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]

输出: 3

解释:

从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油

开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油

开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油

开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油

开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油

开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。

因此,3 可为起始索引。

示例2

输入: gas = [2,3,4], cost = [3,4,3]

输出: -1

解释:

你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。

我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油

开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油

开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油

你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。

因此,无论怎样,你都不可能绕环路行驶一周。

提示

  • gas.length == n
  • cost.length == n
  • 1 <= n <= 105
  • 0 <= gas[i], cost[i] <= 104

👉️ 力扣原文

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        int start=0;
        int totalSum = 0;
        for(int i=0;i<n;i++){
            sum+=gas[i]-cost[i];
            totalSum+=gas[i]-cost[i];
            if(sum < 0){
                start = i + 1;
                sum=0;
            }
        }
        if(totalSum < 0)
            return -1;
        return start;
    }
}

详细解读

让我们逐行解读这段代码:

  1. int n = gas.length; - 获取加油站数量,即数组 gas 的长度。
  2. int sum = 0; - 初始化 sum 为0,用于计算当前从 start 出发的汽油量。
  3. int start = 0; - 初始化 start 为0,表示从第一个加油站出发。
  4. int totalSum = 0; - 初始化 totalSum 为0,用于计算整个环形路线的总汽油量。
  5. 进入 for 循环,遍历加油站。
  6. sum += gas[i] - cost[i]; - 计算当前加油站的汽油剩余量,即从 start 到当前加油站,减去消耗的汽油量。
  7. totalSum += gas[i] - cost[i]; - 同时,将汽油剩余量累加到 totalSum 中,表示整个环形路线的总汽油剩余量。
  8. if (sum < 0) - 如果 sum 小于0,表示从 start 出发无法到达当前加油站,这时需要选择下一个加油站作为新的起点。
  9. start = i + 1; - 更新 start 为下一个加油站的索引,表示从下一个加油站重新出发。
  10. 循环继续,处理下一个加油站。
  11. 循环结束后,如果 totalSum 小于0,表示整个环形路线的汽油总量不足以绕一圈,返回 -1。
  12. 否则,返回 start,表示找到了一个合适的起点,可以绕整个环形路线一圈回到起点。

这个算法的时间复杂度是 O(n),其中 n 是加油站的数量。它通过遍历一次数组,找到适合的起点,以保证能够绕一圈。这是一个高效的解决方案,可以有效地解决加油站问题。

相关文章
|
5天前
|
机器学习/深度学习 算法 数据挖掘
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
**摘要:** 了解9种距离和相似度算法:欧氏距离、余弦相似度、汉明距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、雅卡尔指数、半正矢距离和Sørensen-Dice系数。这些算法在机器学习、文本分析、图像处理和生物学等领域各有应用。例如,欧氏距离用于KNN和K-Means,余弦相似度用于文本相似性,汉明距离在错误检测中,曼哈顿距离在数据挖掘,切比雪夫距离在棋盘游戏,闵可夫斯基距离通过调整参数适应不同场景,雅卡尔指数和Sørensen-Dice系数用于集合相似度。每种算法有其优缺点,如欧氏距离对异常值敏感,余弦相似度忽略数值大小,汉明距离仅适用于等长数据。
17 2
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
|
3天前
|
算法
刷算法Leetcode---9(二叉树篇Ⅲ)
刷算法Leetcode---9(二叉树篇Ⅲ)
9 3
|
23小时前
|
算法 搜索推荐 Java
在Java中实现高效的算法与数据结构
在Java中实现高效的算法与数据结构
|
3天前
|
机器学习/深度学习 分布式计算 算法
在Java中使用机器学习算法的实际案例
在Java中使用机器学习算法的实际案例
|
3天前
|
存储 缓存 算法
Java中的数据结构与算法优化实践
Java中的数据结构与算法优化实践
|
4天前
|
搜索推荐 算法 Java
优化Java中大数据量排序算法
优化Java中大数据量排序算法
|
5天前
|
算法 Java 数据安全/隐私保护
Java中的位操作与算法优化
Java中的位操作与算法优化
|
6天前
|
数据采集 搜索推荐 算法
使用Java编写高效的搜索引擎算法
使用Java编写高效的搜索引擎算法
|
1天前
|
Java 开发者 UED
Java中的并发编程:解锁多线程的力量
【7月更文挑战第7天】在Java的世界中,掌握并发编程是提升应用性能和响应能力的关键。本文将深入探讨如何在Java中高效地使用多线程,包括创建和管理线程、同步机制、以及避免常见的并发陷阱。我们将一起探索锁、线程池、并发集合等工具,并了解如何通过这些工具来优化程序的性能和稳定性。
|
3天前
|
监控 安全 Java
Java中的线程调度与性能优化技巧
Java中的线程调度与性能优化技巧