class Solution {
public:
int maxSum(vector<int>& nums) {
}
};
6939. 数组中的最大数对和
给你一个下标从 0 开始的整数数组 nums
。请你从 nums
中找出和 最大 的一对数,且这两个数数位上最大的数字相等。
返回最大和,如果不存在满足题意的数字对,返回 -1
。
示例 1:
输入:nums = [51,71,17,24,42] 输出:88 解释: i = 1 和 j = 2 ,nums[i] 和 nums[j] 数位上最大的数字相等,且这一对的总和 71 + 17 = 88 。 i = 3 和 j = 4 ,nums[i] 和 nums[j] 数位上最大的数字相等,且这一对的总和 24 + 42 = 66 。 可以证明不存在其他数对满足数位上最大的数字相等,所以答案是 88 。
示例 2:
输入:nums = [1,2,3,4] 输出:-1 解释:不存在数对满足数位上最大的数字相等。
提示:
2 <= nums.length <= 100
1 <= nums[i] <= 104
原站题解
javascript 解法, 执行用时: 92 ms, 内存消耗: 46 MB, 提交时间: 2023-08-14 09:32:11
/** * @param {number[]} nums * @return {number} */ var maxSum = function (nums) { let ans = -1; let maxVal = Array(10).fill(Number.MIN_SAFE_INTEGER); for (const v of nums) { let maxD = 0; for (let x = v; x; x = Math.floor(x / 10)) maxD = Math.max(maxD, x % 10); ans = Math.max(ans, v + maxVal[maxD]); maxVal[maxD] = Math.max(maxVal[maxD], v); } return ans; };
golang 解法, 执行用时: 16 ms, 内存消耗: 4.8 MB, 提交时间: 2023-08-14 09:31:50
func maxSum(nums []int) int { ans := -1 maxVal := [10]int{} for i := range maxVal { maxVal[i] = math.MinInt // 表示不存在最大值 } for _, v := range nums { maxD := 0 for x := v; x > 0; x /= 10 { maxD = max(maxD, x%10) } ans = max(ans, v+maxVal[maxD]) maxVal[maxD] = max(maxVal[maxD], v) } return ans } func max(a, b int) int { if b > a { return b }; return a }
java 解法, 执行用时: 2 ms, 内存消耗: 42.7 MB, 提交时间: 2023-08-14 09:31:31
class Solution { public int maxSum(int[] nums) { int ans = -1; var maxVal = new int[10]; Arrays.fill(maxVal, Integer.MIN_VALUE); for (int v : nums) { int maxD = 0; for (int x = v; x > 0; x /= 10) maxD = Math.max(maxD, x % 10); ans = Math.max(ans, v + maxVal[maxD]); maxVal[maxD] = Math.max(maxVal[maxD], v); } return ans; } }
python3 解法, 执行用时: 80 ms, 内存消耗: 16 MB, 提交时间: 2023-08-14 09:31:15
''' 用max_val维护最大数位为 i 的元素的最大值。 ''' class Solution: def maxSum(self, nums: List[int]) -> int: ans = -1 max_val = [-inf] * 10 for v in nums: max_d = max(map(int, str(v))) ans = max(ans, v + max_val[max_d]) max_val[max_d] = max(max_val[max_d], v) return ans