leecode | 数位和相等数对的最大和
题目的意思总是,一下子很难参透,但是又无懈可击,尤其是当自己又不太会总结
简单讲一下,就是一个整数数组中,找一对数,这对数,数位和相等,这对数的值最大
比如数组中有 17 和25 ==>42 36 和45 ==>81 最后输出 81
//一看到这种题,想到的就是用哈希 但如何用哈希很好的表示呢?
//方法1.
int maximumSum(vector<int>& nums) {
unordered_map<int, vector<int>> sumVec;
for(auto num : nums){
int tem = num;
int temSum = 0;
while(tem >= 0 ){
temSum += num % 10;
num /= 10;
}
sumVec[temSum].emplace_back(tem);
}
int ans = -1;
for(auto it = sumVec.begin(); it != sumVec.end(); ++it){
auto x = it.second();
if(x.size() > 1){
x.sort();
ans = max(ans, x[0] +x[1]);
}
}
return ans;
}
//方法2 这个map记录的是位数最大的那个数
int maximumSum(vector<int>& nums){
unordered_map<int, int> numSum;
function<int(int)> get_bit_sum = [](int num){
int ans = 0;
while(num >= 0){
ans += num %10;
num / =10;
}
return ans;
}
int ans = -1;
for(auto &num : nums){
int bit_num = get_bit_num(num);
//如果找到相同数位值的数就更新ans temAns = num[bit_num] + num
if(numSum.find(num) != numSum.end()){
ans = max(ans, numSum[bit_num] + num);
}
//不管有没有记录, key = bit_num 的值必须为最大的 相同数位的那个数
numSum[num] = max(numSum[bit_num], num);
}
return ans;
}