列表

详情


2342. 数位和相等数对的最大和

给你一个下标从 0 开始的数组 nums ,数组中的元素都是 整数。请你选出两个下标 iji != j),且 nums[i] 的数位和 与  nums[j] 的数位和相等。

请你找出所有满足条件的下标 ij ,找出并返回 nums[i] + nums[j] 可以得到的 最大值

 

示例 1:

输入:nums = [18,43,36,13,7]
输出:54
解释:满足条件的数对 (i, j) 为:
- (0, 2) ,两个数字的数位和都是 9 ,相加得到 18 + 36 = 54 。
- (1, 4) ,两个数字的数位和都是 7 ,相加得到 43 + 7 = 50 。
所以可以获得的最大和是 54 。

示例 2:

输入:nums = [10,12,19,14]
输出:-1
解释:不存在满足条件的数对,返回 -1 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maximumSum(vector<int>& nums) { } };

cpp 解法, 执行用时: 132 ms, 内存消耗: 58.9 MB, 提交时间: 2023-11-18 04:47:14

class Solution {
public:
    int maximumSum(vector<int>& nums) {
        int n = nums.size();
        // 数位和,最大值
        unordered_map<int, int> cnt;
        int res = -1;
        for(int i = 0; i < n; i++) {
            // 当前值
            int x = nums[i];
            // 数位和
            int cur = 0;
            while(x > 0) {
                cur += x % 10;
                x /= 10;
            }
            if(cnt.count(cur)) {
                res = max(res, nums[i] + cnt[cur]);
            }
            cnt[cur] = max(nums[i], cnt[cur]);
        }

        return res;
    }
};

java 解法, 执行用时: 74 ms, 内存消耗: 58.1 MB, 提交时间: 2023-11-18 04:46:10

class Solution {
    public int maximumSum(int[] nums) {
        Arrays.sort(nums);
        Map<Integer, Integer> map = new HashMap<>();
        int res = -1;
        for (int num : nums) {
            int k = getSum(num);
            if (map.containsKey(k)) {
                res = Math.max(map.get(k) + num, res);
            }
            map.put(k, num);
        }
        return res;
    }
    
    int getSum(int i) {
        int sum = 0;
        while(i > 0) {
            sum += i % 10;
            i /= 10;
        }
        return sum;
    }
}

golang 解法, 执行用时: 112 ms, 内存消耗: 9.7 MB, 提交时间: 2023-01-11 09:53:12

func maximumSum(nums []int) int {
	ans := -1
	mx := map[int]int{}
	for _, v := range nums {
		s := 0
		for x := v; x > 0; x /= 10 {
			s += x % 10
		}
		if mx[s] > 0 {
			ans = max(ans, mx[s] + v)
		}
		mx[s] = max(mx[s], v)
	}
	return ans
}

func max(a, b int) int { if b > a { return b }; return a }

python3 解法, 执行用时: 440 ms, 内存消耗: 26.3 MB, 提交时间: 2023-01-11 09:52:52

class Solution:
    def maximumSum(self, nums: List[int]) -> int:
        ans = -1
        mx = defaultdict(int)
        for num in nums:
            # s = sum(int(d) for d in str(num))
            s, x = 0, num
            while x:
                s += x % 10
                x //= 10
            if s in mx: ans = max(ans, mx[s] + num)
            mx[s] = max(mx[s], num)
        return ans

上一题