【LeetCode:2342. 数位和相等数对的最大和 | HashMap + 模拟 】

文章讨论了解决编程题目中关于给定数组中数位和相等的数对,要求最大和的问题。提供了两种方法,一种是使用HashMap模拟,另一种是优化后的思路,类似LeetCode中的“两数之和”问题。作者强调了在解决这类问题时的思考策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

在这里插入图片描述

🚩 题目链接

⛲ 题目描述

给你一个下标从 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

🥦 求解思路
  1. 直接通过模拟即可,设计一个HashMap数据结构,key为数位之和num,value为数位之和为num的每一个数字,因为是有多个的,此处通过ArrayList来存储即可。
  2. 具体实现过程如下所示:
🥦 实现代码
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+求解思路

🥦 求解思路
  1. 上面的做法虽然可以通过,但是有点复杂,可以使用更好的方法来进行优划改进。
  2. 该题的求解思路类似于LeetCode第一题【俩数之和】,我们一样,向右枚举每一个数的数位之和,但是需要注意的是,需要判断左侧的元素数位之和是否有与其相等的,如果有,我们记录此时俩个元素的最大值,同时,更新该位置的最大元素数值。
  3. 总结:类似于这样的俩个数的题目,通用求解思路是,枚举右(后执行),维护左(先判断是否满足)。
  4. 具体实现思路如下所示:
🥦 实现代码
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;
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值