四、形成三的最大倍數(Weekly Contest 177)

題目描述:
給你一個整數數組 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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

貪心:首先將數組排序,並且看和是否能夠被三整除,如果可以那麼就是排序後的遞減就是最大,否則我們找sum % 3 == 1 或者 sum % 3 == 2的情況,能減去一個的就減去一個,否則減去兩個,比如 1 1 1 2 我們刪除一個2就可以滿足而不用刪除兩個1,因此貪心法即可:
代碼

class Solution {
   
    public String largestMultipleOfThree(int[] digits) {
        int sum = 0;
        for (int digit : digits) {
            sum += digit;
        }
        Arrays.sort (digits);
        if(digits[digits.length - 1] == 0){
            return "0";
        }
        if(sum % 3 == 0){
            String s = get (digits, -1,-1);
            return s;
        }
//        嘗試去掉i
        for (int i = 0; i < digits.length; i++) {
            if(digits[i] % 3 == sum % 3){
                return get (digits,i,-1);
            }
        }
//        去掉兩個
        for (int i = 0; i < digits.length; i++) {
            for (int j = i + 1; j < digits.length; j++) {
                if((digits[i] + digits[j]) % 3 == sum % 3){
                    return get (digits,i,j);
                }
            }
            
        }
        return "0";
    }
    public String get(int []digits,int j,int k){
        StringBuilder sb= new StringBuilder ();
        for (int i = digits.length - 1; i >= 0; i--) {
            if(j == i || i == k){
                continue;
            }
            sb.append (digits[i]);
        }
        return sb.toString ();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章