Leetcode 6164.数位和相等数对的最大和
1.问题描述
2.解决方案
解法一:暴力
暴力遍历所有数对,然后判断每一个数对是否数位和相等,如果相等,更新最大值(有些大的样例,超时了)
class Solution {
Integer max = Integer.MIN_VALUE;
public void judge(int a, int b){
String str1 = Integer.toString(a);
String str2 = Integer.toString(b);
Integer sum1 = 0, sum2 = 0;
for(char c : str1.toCharArray()){
sum1 += Integer.parseInt(String.valueOf(c));
}
for(char c : str2.toCharArray()){
sum2 += Integer.parseInt(String.valueOf(c));
}
if(sum1==sum2) max = Math.max(max, a+b);
}
public int maximumSum(int[] nums) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
judge(nums[i], nums[j]);
}
}
return Math.max(max, -1);
}
}
解法二:哈希表
哈希存储 [key:数位和(9),value:数字(18) ],后面有数位和一样的,就去更新最大值,并且把更大的数字留在map里面,方便后面的再出现数位和一样的,能和最大的数字相加,更新最大值。
class Solution {
public int numSum(int a){
String str = Integer.toString(a);
int sum = 0;
for(char c : str.toCharArray()){
sum += Integer.parseInt(String.valueOf(c));
}
return sum;
}
public int maximumSum(int[] nums) {
int max = Integer.MIN_VALUE;
HashMap<Integer, Integer> map = new HashMap<>();
for(int i : nums){
int key = numSum(i);
if(!map.containsKey(key)){
map.put(key, i);
}else{
int value = map.get(key);
max = Math.max(max, value+i);
if(i>value){
map.put(key, i);
}
}
}
return Math.max(max, -1);
}
}