题目地址:
https://leetcode.com/problems/most-visited-sector-in-a-circular-track/
给定一个环形赛道,分 n n n个扇区,逆时针按 1 ∼ n 1\sim n 1∼n编号。给定一个数组 A A A,跑 m m m次,每次都是从 A [ i ] A[i] A[i]逆时针跑到 A [ i + 1 ] A[i+1] A[i+1]。问经过次数最多的扇区的编号是哪些。以数组形式返回,答案中要求扇区编号升序。注意,如果从 A [ i ] A[i] A[i]跑到 A [ i + 1 ] A[i+1] A[i+1],然后再继续跑到 A [ i + 2 ] A[i+2] A[i+2],这里 A [ i + 1 ] A[i+1] A[i+1]的经过次数只算一次而不是两次。
设 A [ 0 ] = s , A [ n − 1 ] = t A[0]=s,A[n-1]=t A[0]=s,A[n−1]=t,如果 t ≥ s t\ge s t≥s,那就说明是从 s s s出发转了若干圈后又多走了 [ s , t ] [s,t] [s,t]这一段,所以答案就是 ( s , s + 1 , . . . , t ) (s,s+1,...,t) (s,s+1,...,t);如果 t < s t<s t<s,那就是从 s s s出发转了若干圈后又多走了 [ s , n ] [s,n] [s,n]和 [ 1 , t ] [1,t] [1,t]这一段,所以答案就是 ( 1 , 2 , . . . , t , s , s + 1 , . . . , n ) (1,2,...,t,s,s+1,...,n) (1,2,...,t,s,s+1,...,n)。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<Integer> mostVisited(int n, int[] rounds) {
List<Integer> res = new ArrayList<>();
int start = rounds[0], end = rounds[rounds.length - 1];
if (end >= start) {
for (int i = start; i <= end; i++) {
res.add(i);
}
} else {
for (int i = 1; i <= end; i++) {
res.add(i);
}
for (int i = start; i <= n; i++) {
res.add(i);
}
}
return res;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。