🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
🚀 算法题 🚀 |
🍔 目录
- 🚩 题目链接
- ⛲ 题目描述
- 🌟 求解思路&实现代码&运行结果
- ⚡ 模拟+HashMap
- 🥦 求解思路
- 🥦 实现代码
- 🥦 运行结果
- ⚡ HashMap+求解思路
- 🥦 求解思路
- 🥦 实现代码
- 🥦 运行结果
- 💬 共勉
🚩 题目链接
- 2342. 数位和相等数对的最大和
⛲ 题目描述
给你一个下标从 0 开始的数组 nums ,数组中的元素都是 正 整数。请你选出两个下标 i 和 j(i != j),且 nums[i] 的数位和 与 nums[j] 的数位和相等。
请你找出所有满足条件的下标 i 和 j ,找出并返回 nums[i] + nums[j] 可以得到的 最大值 。
示例 1:
输入:nums = [18,43,36,13,7]
输出:54
解释:满足条件的数对 (i, j) 为:
- (0, 2) ,两个数字的数位和都是 9 ,相加得到 18 + 36 = 54 。
- (1, 4) ,两个数字的数位和都是 7 ,相加得到 43 + 7 = 50 。
所以可以获得的最大和是 54 。
示例 2:
输入:nums = [10,12,19,14]
输出:-1
解释:不存在满足条件的数对,返回 -1 。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
🌟 求解思路&实现代码&运行结果
⚡ 模拟+HashMap
🥦 求解思路
- 直接通过模拟即可,设计一个HashMap数据结构,key为数位之和num,value为数位之和为num的每一个数字,因为是有多个的,此处通过ArrayList来存储即可。
- 具体实现过程如下所示:
🥦 实现代码
class Solution {
public int maximumSum(int[] nums) {
HashMap<Integer,ArrayList<Integer>> map=new HashMap<>();
for(int v:nums){
int res=sumDigit(v);
if(!map.containsKey(res)){
ArrayList<Integer> ans=new ArrayList<>();
ans.add(v);
map.put(res,ans);
}else{
map.get(res).add(v);
}
}
int max=-1;
for(Map.Entry<Integer,ArrayList<Integer>> entry:map.entrySet()){
int key=entry.getKey();
ArrayList<Integer> value=entry.getValue();
if(value.size()<=1) continue;
Collections.sort(value);
max=Math.max(max,value.get(value.size()-1)+value.get(value.size()-2));
}
return max;
}
public int sumDigit(int num){
int sum=0;
while(num!=0){
sum+=num%10;
num/=10;
}
return sum;
}
}
🥦 运行结果
⚡ HashMap+求解思路
🥦 求解思路
- 上面的做法虽然可以通过,但是有点复杂,可以使用更好的方法来进行优划改进。
- 该题的求解思路类似于LeetCode第一题【俩数之和】,我们一样,向右枚举每一个数的数位之和,但是需要注意的是,需要判断左侧的元素数位之和是否有与其相等的,如果有,我们记录此时俩个元素的最大值,同时,更新该位置的最大元素数值。
- 总结:类似于这样的俩个数的题目,通用求解思路是,枚举右(后执行),维护左(先判断是否满足)。
- 具体实现思路如下所示:
🥦 实现代码
class Solution {
public int maximumSum(int[] nums) {
int n=nums.length;
Map<Integer,Integer> map=new HashMap<>();
int ans=-1;
for(int i=0;i<n;i++){
int t=nums[i];
int sum=0;
while(t!=0){
sum+=t % 10;
t/=10;
}
if(map.containsKey(sum)){
int y=map.get(sum);
ans=Math.max(ans,y+nums[i]);
if(y<nums[i]){
map.put(sum,nums[i]);
}
}else{
map.put(sum,nums[i]);
}
}
return ans;
}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |