Example 11
公交站间的距离
题目概述:环形公交路线上有n个站,按次序从0到n - 1进行编号。我们已知每一对相邻公交站之间的距离,distance[i]表示编号为i的车站和编号为(i + 1) % n的车站之间的距离。
环线上的公交车都可以按顺时针和逆时针的方向行驶。
返回乘客从出发点start到目的地destination之间的最短距离。
示例 1:
输入:distance = [1,2,3,4], start = 0, destination = 1
输出:1
解释:公交站 0 和 1 之间的距离是 1 或 9,最小值是 1。
示例 2:
输入:distance = [1,2,3,4], start = 0, destination = 2
输出:3
解释:公交站 0 和 2 之间的距离是 3 或 7,最小值是 3。
示例 3:
输入:distance = [1,2,3,4], start = 0, destination = 3
输出:4
解释:公交站 0 和 3 之间的距离是 6 或 4,最小值是 4。
解题思路:记数组distance 的长度为n。假设start≤destination,那么可以:
从start到destination,距离为;
从start 到0,再从0到destination,距离为。
答案为这两个距离的最小值。
解题步骤:
1. 因为在后续处理中涉及到循环问题,默认初始点总是小于终点,因此,首先判断初始点是否小于终点,若不小于,则将初始点与终点对调,以保证初始点总是小于终点,且最终结果不变。
2. 定义变量sum1和sum2,分别记录正行与逆行的距离,其初始值均为0。
3. 因整条路径是环形路段,因此正行路段与逆行路段之和为整条路径的和,则遍历整条路径,若某支分路径编号在[start,destination)之间,则其属于正行路段,将其加到sum1中,否则说明其属于逆行路段,将其加到sum2中。
4. 遍历结束后,将sum1与sum2的较小值返回,即为最短路径。
示例代码如下:
public class DistanceFromBusStop { /** * 环形公交路线上有n个站,按次序从0到n - 1进行编号。我们已知每一对相邻公交站之间的距离,distance[i]表示编号为i的车站和编号为(i + 1) % n的车站之间的距离。 * 环线上的公交车都可以按顺时针和逆时针的方向行驶。 * 返回乘客从出发点start到目的地destination之间的最短距离。 * 示例 1: * 输入:distance = [1,2,3,4], start = 0, destination = 1 * 输出:1 * 解释:公交站 0 和 1 之间的距离是 1 或 9,最小值是 1。 * 示例 2: * 输入:distance = [1,2,3,4], start = 0, destination = 2 * 输出:3 * 解释:公交站 0 和 2 之间的距离是 3 或 7,最小值是 3。 * 示例 3: * 输入:distance = [1,2,3,4], start = 0, destination = 3 * 输出:4 * 解释:公交站 0 和 3 之间的距离是 6 或 4,最小值是 4。 * 来源:力扣(LeetCode) * 链接:https://leetcode.cn/problems/distance-between-bus-stops */ public static void main(String[] args) { DistanceFromBusStop dfbs = new DistanceFromBusStop(); System.out.println(dfbs.distanceBetweenBusStops(new int[]{7, 10, 1, 12, 11, 14, 5, 0}, 7, 2)); } /** * 个人 * @param distance * @param start * @param destination * @return */ /*public int distanceBetweenBusStops(int[] distance, int start, int destination) { int n = distance.length; int totalLength = 0; for (int i : distance) { totalLength += i; } int distanceOne = 0; int begin = Math.min(start, destination); int end = Math.max(start, destination); for (int i = begin; i < end; i++) { distanceOne += distance[i]; } return Math.min(distanceOne, totalLength -distanceOne); }*/ /** * 官方 * * @param distance * @param start * @param destination * @return */ public int distanceBetweenBusStops(int[] distance, int start, int destination) { if (start > destination) { int temp = start; start = destination; destination = temp; } int sum1 = 0, sum2 = 0; for (int i = 0; i < distance.length; i++) { if (i >= start && i < destination) { sum1 += distance[i]; } else { sum2 += distance[i]; } } return Math.min(sum1, sum2); } }