2342. 数位和相等数对的最大和
我的解法:
对数组进行排序,最大数一定最先进入哈希表进行加和
class Solution {
public:int maximumSum(vector<int>& nums) {unordered_map<int, vector<int>> h;int ans = -1;sort(nums.begin(), nums.end());for (int i = nums.size() - 1; i >= 0; i--) {int num = nums[i];int sum = 0;while (num != 0) {sum += num % 10;num = num / 10;}h[sum].push_back(nums[i]);if (h[sum].size() >= 2) {ans = max(ans, h[sum][0] + h[sum][1]);continue;}}return ans;}
};
注意这里:
if (h[sum].size() >= 2) {ans = max(ans, h[sum][0] + h[sum][1]);continue;}
我原来写成了:
if (h[sum].size() >= 2) {ans = max(ans, h[sum][0] + h[sum][1]);break;}
这是不对的,不一定最先凑对的两个数字的加和最大。
例如:[51, 32, 91, 42, 71, 19]
优化:
由于1 <= nums[i] <= 1e9,所以每个数字对应的数位和最大值为9*9=81,于是初始化哈希表可以优化为大小为100的数组
在数组里存储遇到的最大num,当前数位和对应数字不为0时(即已有等于当前数位和的数字进入,可以确保保存当前数位和的最大数),则更新ans,其中“确保保存当前数位和的最大数”通过这句实现:
h[sum] = max(h[sum], num);
整体代码:
class Solution {
public:int maximumSum(vector<int>& nums) {vector<int> h(100, 0);int ans = -1;for (int num: nums) {int t = num;int sum = 0;while (t != 0) {sum += t % 10;t = t / 10;}if (h[sum] != 0) ans = max(ans, h[sum] + num);h[sum] = max(h[sum], num);}return ans;}
};