CodeSprout程式萌芽
困難第 472 題 · 分類讀值最低值
CodeSprout 官方2026/10/04 00:19
官方解答 · 置頂Java

官方解答|分類讀值最低值

官方解答|分類讀值最低值

解題思路

先按「非零」篩選原值,再用 Math.floorMod(x, 3) 算鍵,將 x/2 加入該鍵清單。TreeMap 依鍵遞增走訪,每群計算最小值後攤平成鍵、統計值。

正確性與邊界

分組鍵用原值,統計用轉換值。floorMod 保證負數落在非負餘數群;群內順序與重複保留,不補沒有出現的鍵。交錯加減每群從正號開始。

複雜度

設 n 為輸入長度、g 為群數。時間 O(n log g),額外空間 O(n)。

公開範例

輸入 {"nums": [1]},依上述步驟得到 [1, 0]。

下方程式可直接取代起始碼;使用 Java 11,入口為 Solution.solve。

CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式

import java.util.*;

public class Solution {
    private static int aggregate(List<Integer> values) {
        if (values.isEmpty()) return 0;
        int answer = values.get(0);
        for (int x : values) answer = Math.min(answer, x);
        return answer;
    }

    public static List<Integer> solve(int[] nums) {
        Map<Integer,List<Integer>> groups = new TreeMap<>();
        for (int x : nums) {
            if (x != 0) {
                int key = Math.floorMod(x,3);
                groups.computeIfAbsent(key, ignored -> new ArrayList<>()).add(x/2);
            }
        }
        List<Integer> result = new ArrayList<>();
        for (Map.Entry<Integer,List<Integer>> entry : groups.entrySet()) {
            result.add(entry.getKey()); result.add(aggregate(entry.getValue()));
        }
        return result;
    }
}

留言討論 0