力扣题解1184

大家好,欢迎来到无限大的频道。

今日继续给大家带来力扣题解。

题目描述(简单):

公交站间的距离

环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distancei 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之间的距离。

环线上的公交车都可以按顺时针和逆时针的方向行驶。

返回乘客从出发点 start 到目的地 destination 之间的最短距离。

​解题思路:

  1. 输入和初始化:

    • 输入为公交站数 n、车站间距数组 distance、出发点 start 和目的地 destination。
  2. 计算顺时针距离:

    • 从 start 到 destination 的顺时针距离可以通过计算 distance 数组中相应站点之间的距离累加得出。
  3. 计算逆时针距离:

    • 逆时针距离可以通过计算从 destination 到 start 的总距离减去顺时针距离得出。这是因为在环形路线中,总距离是固定的。
  4. 取最小值:

    • 最后,返回顺时针和逆时针距离中的最小值。

      ​

参考代码:

复制代码
int distanceBetweenBusStops(int* distance, int distanceSize, int start, int destination) {
    // 确保 start 是较小的索引
    if (start > destination) {
        int temp = start;
        start = destination;
        destination = temp;
    }
​
    // 计算顺时针距离
    int clockwiseDistance = 0;
    for (int i = start; i < destination; i++) {
        clockwiseDistance += distance[i];
    }
​
    // 计算逆时针距离
    int totalDistance = 0;
    for (int i = 0; i < distanceSize; i++) {
        totalDistance += distance[i];
    }
    int counterClockwiseDistance = totalDistance - clockwiseDistance;
​
    // 返回最小距离
    return clockwiseDistance < counterClockwiseDistance ? clockwiseDistance : counterClockwiseDistance;
}

时间复杂度​:

  1. 确保 `start` 是较小的索引:

if (start > destination) {

int temp = start;

start = destination;

destination = temp;

}

这部分代码只进行了一次比较和可能的交换,因此它的时间复杂度是 O(1)。

  1. 计算顺时针距离:

int clockwiseDistance = 0;

for (int i = start; i < destination; i++) {

clockwiseDistance += distancei;

}

这个循环从 `start` 到 `destination` 之间的索引进行累加。假设 `start` 和 `destination` 之间的距离为 d,这个部分的时间复杂度是 O(d)。

  1. 计算总距离:

int totalDistance = 0;

for (int i = 0; i < distanceSize; i++) {

totalDistance += distancei;

}

这个循环遍历整个 `distance` 数组,计算总距离。由于 `distanceSize` 为 n,这个部分的时间复杂度是 O(n)。

  1. 计算逆时针距离:

int counterClockwiseDistance = totalDistance - clockwiseDistance;

这部分只进行了一次减法运算,因此它的时间复杂度是 O(1)。

  1. 返回最小距离:

return clockwiseDistance < counterClockwiseDistance ? clockwiseDistance : counterClockwiseDistance;

这部分也是一个简单的比较和返回,所以时间复杂度也是 \(O(1)\)。

​

将所有部分的时间复杂度相加,我们得到:

  • 计算顺时针距离:O(d)

  • 计算总距离:O(n)

因此,整体的时间复杂度主要由这两个部分决定。由于 d可能最多等于 n(在最坏情况下,即 `start` 为 0,`destination` 为 n-1),所以我们可以将 d的复杂度视为 O(n)。

最终,这段代码的总时间复杂度是:

O(n)

空间复杂度:

在空间复杂度方面,代码中只使用了常量级别的额外空间(几个整型变量),因此空间复杂度是 O(1)。

相关推荐
UIU1148 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi9 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院11 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng11 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋13 小时前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~14 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py14 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing15 小时前
LeetCode100 42.接雨水
java·算法·leetcode