跳转至

LintCode-1604 两数最大和

Tags: Medium Hash Table

Links: https://www.lintcode.com/problem/maximum-sum-of-two-numbers/description


给定一个由N个整数组成的数组A,返回两个数字的最大总和,规定这两个数的所有位加起来相等。 如果没有两个数字的各个位相加和相等,则该函数应返回-1。

样例

示例1:
输入:
A = [51, 71, 17, 42]
输出: 93
解释:这里有两对各个位相加和相等的数:(51, 42) 和 (17,71),第一对的和是93
示例2:
输入:
A = [42, 33, 60]
输出: 102
解释:所有的数各个位相加的和都相等,选择42 + 60 = 102
示例3:
输入:
A = [51, 32, 43]
输出: -1
解释: 所有数的各个位相加和都不一样,因此返回-1

注意事项

  • N的范围是 [1, 200000]
  • A中的每一个参数的范围是 [1, 1000000000]

class Solution {
public:
    /**
     * @param A: An Integer array
     * @return: returns the maximum sum of two numbers
     */
    int MaximumSum(vector<int> &A) {
        std::ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);

        unordered_map<int, vector<int>> m;
        int n = A.size();
        for (int i = 0; i < n; ++i) {
            int sum = cal(A[i]);
            if (m.find(sum) != m.end()) {
                m[sum].push_back(A[i]);
            }
            else {
                m[sum] = {A[i]};
            }
        }

        int res = -1;
        for (auto e : m) {
            if (e.second.size() >= 2) {
                sort(e.second.begin(), e.second.end());
                int len = e.second.size();
                res = max(res, e.second[len - 1] + e.second[len - 2]);
            }
        }

        return res;
    }

    int cal(int n)
    {
        int sum = 0;
        while (n) {
            sum += n % 10;
            n /= 10;
        }
        return sum;
    }
};