LeetCode 1363. 形成三的最大倍数(贪心,难)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1363. 形成三的最大倍数(贪心,难)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給你一個整數數組 digits,你可以通過按任意順序連接其中某些數字來形成 3 的倍數,請你返回所能得到的最大的 3 的倍數。
由于答案可能不在整數數據類型范圍內,請以字符串形式返回答案。
如果無法得到答案,請返回一個空字符串。
示例 1: 輸入:digits = [8,1,9] 輸出:"981"示例 2: 輸入:digits = [8,6,7,1,0] 輸出:"8760"示例 3: 輸入:digits = [1] 輸出:""示例 4: 輸入:digits = [0,0,0,0,0,0] 輸出:"0"提示: 1 <= digits.length <= 10^4 0 <= digits[i] <= 9 返回的結果不應包含不必要的前導零。來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/largest-multiple-of-three
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
容易錯的數據:
[9,8,6,8,6] [2,2,1,1,1] [1,1,1,2] [5,8]2. 解題
- 把所有數加起來和為sum,總的字符串降序排序,然后sum%3,看余數
- 等于0,直接返回
- 等于1,優先刪除1個1 or 4 or 7,沒有的話,刪除2,5,8中最小的2個
- 等于2,優先刪除1個2 or 5 or 8,沒有的話,刪除1,4,7中最小的2個
大佬優美解:
class Solution {int cnt[10], sum;string ans = "";set<int> s;int del(int m){for(int i=m;i<=9;i+=3)if(cnt[i]){cnt[i]--;return 1;}return 0;} public:string largestMultipleOfThree(vector<int>& d) {for(auto x:d)cnt[x]++, sum += x;if(sum%3==1)if(!del(1))del(2),del(2);if(sum%3==2)if(!del(2))del(1),del(1);for(int i=9; i>=0; i--)while(cnt[i]--)ans += i+'0', s.insert(i);if(s.size()==1 && s.count(0))return "0";// [1,0,0] -> "0"return ans;} };作者:YusenZhang_chatc 鏈接:https://leetcode-cn.com/problems/largest-multiple-of-three/solution/c-qu-diao-zui-xiao-zhi-8ms-by-yusenzhang_chatc/總結
以上是生活随笔為你收集整理的LeetCode 1363. 形成三的最大倍数(贪心,难)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1362. 最接近的因
- 下一篇: LeetCode 297. 二叉树的序列