第一题:圆形赛道上经过次数最多的扇区
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<Integer> mostVisited(int n, int[] rounds) {
List<Integer> res = new ArrayList<>();
int[] nums = new int[n + 1];//经过扇区的次数
//不要用 0 存储
for(int i = 1; i < rounds.length; i++){
while(rounds[i-1] != rounds[i]){
nums[rounds[i-1]]++;
rounds[i-1]++;
if(rounds[i-1] > n){
rounds[i-1] = 1;
}
}
}
nums[rounds[rounds.length - 1]]++;
int maxNum = Integer.MIN_VALUE;
for(int i = 1; i < nums.length; i++){
if(nums[i] > maxNum){
maxNum = nums[i];
}
}
for(int i = 1; i < nums.length; i++){
if(nums[i] == maxNum){
res.add(i);
}
}
return res;
}
}
第二题:你可以获得的最大硬币数量
import java.util.Arrays;
class Solution {
public int maxCoins(int[] piles) {
Arrays.sort(piles);
int sum = 0;
int count = piles.length / 3;
for(int i = piles.length - 2; i > 0 && count > 0; i -= 2){
sum += piles[i];
count--;
}
return sum;
}
}
第三题:查找大小为M的最新分组
逆着想,数组从右向左遍历,找到第一个“1”的个数是 m 的分组立即返回。初始值全为 1,只要遍历到,就会变成 0。
import java.util.TreeSet;
class Solution {
public int findLatestStep(int[] arr, int m) {
TreeSet<Integer> ts = new TreeSet<>();
ts.add(0);
ts.add(arr.length + 1);
if(m == arr.length){
return arr.length;
}
for(int i = arr.length - 1; i > 0; i--){
int index = arr[i];
int front = ts.lower(index);
int end = ts.higher(index);
if(index - front - 1 == m || end - index - 1 == m){
return i;
}
ts.add(index);
}
return -1;
}
}
第四题:待补充