給定一組非負整數,重新排列它們的順序使之組成一個最大的整數。例如 [3,30,34,5,9] → "9534330"。結果可能很大,返回字符串。
關鍵在於定義兩個數字 a 和 b 的「大小」:比較拼接字符串 ab 和 ba 的字典序(或數值)。若 ab > ba,則 a 應排在 b 前面。
a_i a_{i+1} ≥ a_{i+1} a_i。ab > ba 定義的關係是可傳遞的)。public String largestNumber(int[] nums) {
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; ++i) strs[i] = String.valueOf(nums[i]);
Arrays.sort(strs, (a, b) -> (b + a).compareTo(a + b)); // 降序
if (strs[0].equals("0")) return "0"; // 全零情況
return String.join("", strs);
}
a+b 和 b+a 的字典序等價於數值比較(因長度相同)。[0,0] 應返回 "0" 而非 "00"。(b+a).compareTo(a+b) 實現降序(大的在前)。string largestNumber(vector& nums) { vector strs; for (int n : nums) strs.push_back(to_string(n)); sort(strs.begin(), strs.end(), [](const string& a, const string& b) { return a + b > b + a; }); if (strs[0] == "0") return "0"; string res; for (auto& s : strs) res += s; return res; }
LeetCode 179 展示了「自定義比較器排序」的強大威力。核心洞見是:局部最優拼接順序(ab vs ba)能推導出全局最優。此類「排序後拼接」問題(如組成最小數、圍牆問題)均可用同套思路解決。