第203場周賽
阿新 • • 發佈:2020-08-23
第一題:圓形賽道上經過次數最多的扇區
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; } }
第四題:待補充