地址 https://www.acwing.com/solution/leetcode/content/6340/算法
題目描述
給你一個整數數組 nums,請你找出並返回能被三整除的元素最大和。數組
示例 1: 輸入:nums = [3,6,5,1,8] 輸出:18 解釋:選出數字 3, 6, 1 和 8,它們的和是 18(可被 3 整除的最大和)。 示例 2: 輸入:nums = [4] 輸出:0 解釋:4 不能被 3 整除,因此沒法選出數字,返回 0。 示例 3: 輸入:nums = [1,2,3,4,4] 輸出:12 解釋:選出數字 1, 3, 4 以及 4,它們的和是 12(可被 3 整除的最大和)。 提示: 1 <= nums.length <= 4 * 10^4 1 <= nums[i] <= 10^4
算法1
最後數組和 只有三種狀況
1 除以3餘0 直接返回
2 除以3餘1 那麼要麼減小一個除以3餘1的數字 或者減小兩個除以3餘2的數字
3 除以3餘2 那麼要麼減小一個除以3餘2的數字 要麼減小兩個除以3餘1的數字spa
class Solution { public: vector<int> v[3]; int Check(int singleIdx,int doubleIdx,int sum) { if (v[doubleIdx].size() < 2) { return sum - v[singleIdx][0]; } else if (v[singleIdx].size() == 0) { return sum - v[doubleIdx][0] - v[doubleIdx][1]; } else { int rem = v[singleIdx][0]; if (rem > (v[doubleIdx][0] + v[doubleIdx][1])) rem = (v[doubleIdx][0] + v[doubleIdx][1]); return sum - rem; } } int maxSumDivThree(vector<int>& nums) { int sum = 0; for (int i = 0; i < nums.size(); i++) { sum += nums[i]; if (nums[i] % 3 == 1) { v[1].push_back(nums[i]); } else if(nums[i] % 3 == 2){ v[2].push_back(nums[i]); } } sort(v[1].begin(), v[1].end()); sort(v[2].begin(), v[2].end()); int sum_n = sum % 3; if (sum_n == 0) return sum; if (sum_n == 1) { //減小兩個v2 和一個v1 選擇 return Check( 1, 2,sum); } if(sum_n == 2){ return Check( 2, 1,sum); } return -1; } };