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;
}

你可能感兴趣的:(力扣,哈希算法,算法,c++)