題目描述:
給你一個整數數組 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 ();
}
}