给你一个下标从 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] <= 10^4
提示 1
Find the largest and second largest element with maximum digits equal to x where 1<=x<=9.
解法:一次遍历
用一个长为 10 的数组 maxVal[i] 维护最大数位为 i 的元素的最大值。
当我们遍历到 nums[i] 时,设其最大数位为 maxD,那么用nums[i]+maxVal[maxD]更新答案。
Java版:
class Solution {
public int maxSum(int[] nums) {
int[] maxVal = new int[10];
int ans = -1;
for (int num: nums) {
int maxD = 0;
for (int x = num; x > 0; x /= 10) {
maxD = Math.max(maxD, x % 10);
}
if (maxVal[maxD] != 0) {
ans = Math.max(ans, num + maxVal[maxD]);
maxVal[maxD] = Math.max(maxVal[maxD], num);
} else {
maxVal[maxD] = num;
}
}
return ans;
}
}
Python版:
class Solution:
def maxSum(self, nums: List[int]) -> int:
maxVal = [0] * 10
ans = -1
for num in nums:
maxD = 0
x = num
while x > 0:
maxD = max(maxD, x % 10)
x //= 10
if maxVal[maxD] != 0:
ans = max(ans, num + maxVal[maxD])
maxVal[maxD] = max(maxVal[maxD], num)
else:
maxVal[maxD] = num
return ans
另一种写法:
class Solution:
def maxSum(self, nums: List[int]) -> int:
maxVal = [0] * 10
ans = -1
for num in nums:
maxD = max(map(int, str(num)))
if maxVal[maxD] != 0:
ans = max(ans, num + maxVal[maxD])
maxVal[maxD] = max(maxVal[maxD], num)
else:
maxVal[maxD] = num
return ans
复杂度分析
- 时间复杂度:O(n * U),其中 n 为 nums 的长度,U= max(nums)的数位。
- 空间复杂度:O(1)。仅用到若干额外变量。