1. 程式人生 > 實用技巧 >第203場周賽

第203場周賽

第一題:圓形賽道上經過次數最多的扇區

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;
    }
}

第四題:待補充