每日算法系列【LeetCode 1363】造成三的最大倍數

題目描述

給你一個整數數組 digits,你能夠經過按任意順序鏈接其中某些數字來造成 3 的倍數,請你返回所能獲得的最大的 3 的倍數。node

因爲答案可能不在整數數據類型範圍內,請以字符串形式返回答案。c++

若是沒法獲得答案,請返回一個空字符串。git

示例1web

輸入: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
  • 返回的結果不該包含沒必要要的前導零。

題解

首先要知道一個小學生都知道的定理:若是一個數能夠被  整除,那麼它的每一位上的數之和也能夠被  整除,反之也成立。svg

那麼問題就轉化爲了挑選出最多的數,使得和是  的倍數。咱們能夠先求出全部數之和,記爲  ,而後有以下三種狀況:學習

  • 若是  ,那麼全部數都選中就好了。
  • 若是  ,那麼必須刪掉一個模  餘  的數(按照從小到大順序刪除 一、四、7)。若是這三個數都沒有,那就要刪除兩個模  餘  的數(按照從小到大順序刪除 二、五、8,刪除兩次)。
  • 若是  ,那麼必須刪掉一個模  餘  的數(按照從小到大順序刪除 二、五、8)。若是這三個數都沒有,那就要刪除兩個模  餘  的數(按照從小到大順序刪除 一、四、7,刪除兩次)。

最終將剩下的數按照從小到大順序排序,拼接在一塊兒就好了。

注意若是有前導  ,就說明答案就是 

時間複雜度爲 

代碼

c++

class Solution {public: int del(vector<int>& cnt, int q) { for (int i = 0; i <= 9; ++i) { if (i%3 == q && cnt[i]) { return --cnt[i]; } } return -1; }
string largestMultipleOfThree(vector<int>& digits) { vector<int> cnt(10, 0); int sum = 0; for (auto x : digits) { cnt[x]++; sum += x; } int q = sum % 3; if (q && del(cnt, q) < 0) { del(cnt, 3-q); del(cnt, 3-q); } string res = ""; for (int i = 9; i >= 0; --i) { while (cnt[i]--) { res += i+'0'; } } if (res.size() && res[0] == '0') return "0"; return res; }};

做者簡介:godweiyang知乎同名華東師範大學計算機系碩士在讀,方向天然語言處理與深度學習喜歡與人分享技術與知識,期待與你的進一步交流~


個人微信:weiyang792321264。有任何問題均可以在評論區留言,也歡迎加我微信深刻溝通~



本文分享自微信公衆號 - 算法碼上來(GodNLP)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索