环形公交路线上有 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。
解法:这个题很简单,只需要往前和往后遍历数组就行,同时需要注意边界条件。第一次导致很多边界条件没有考虑到,但后面突然发现有更快更简单的方法。
解法一:前后循环遍历,判断边界条件。
class Solution {
public int distanceBetweenBusStops(int[] distance, int start, int destination) {
int sum_pre=0,sum_last=0;
int min=start,max=destination;
//如果出发点和目的地相同,则为0
if(start==destination)
return 0;
//先统一使用小和大来遍历
if(start>destination){
min=destination;
max=start;
}
//先从前往后找距离
for(int i=min;i<max;i++){
sum_last+=distance[i];
}
//从后往前找,通过取余实现循环查找
int index=max%(distance.length-1);
//如果刚开始max取余和min相等的话,第一次就直接就是distance的距离
if(index==min){
sum_pre+=distance[max];
}
while(index!=min){
//因为使用的是distance长度-1,如果中间出现max取余之后index=0的情况,则需要全部加入
if(index==0){
sum_pre+=distance[max];
sum_pre+=distance[index];
max++;
index=max%(distance.length-1);
}else{
sum_pre+=distance[index];
max++;
index=max%(distance.length-1);
}
//如果取余之后的循环取得index和min为0的话,只需要distance[max]
if((index==0)&&(min==0)){
sum_pre+=distance[max];
}
}
return (sum_pre<sum_last)?sum_pre:sum_last;
}
}
解法二:其实该题只需要遍历一次数组,从start到destination是一段,而其他元素刚好也是从destination到start的元素。
class Solution {
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);
}
}