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

在这里插入图片描述

算法题

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

算法题

在这里插入图片描述

【LeetCode:2342. 数位和相等数对的最大和 | HashMap + 模拟 】_第1张图片

目录

    • 题目链接
    • ⛲ 题目描述
    • 求解思路&实现代码&运行结果
      • ⚡ 模拟+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

求解思路
  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;
    }
}
运行结果

【LeetCode:2342. 数位和相等数对的最大和 | HashMap + 模拟 】_第2张图片

⚡ 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;
    }
}
运行结果

【LeetCode:2342. 数位和相等数对的最大和 | HashMap + 模拟 】_第3张图片


共勉

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

在这里插入图片描述

你可能感兴趣的:(LeetCode每日一题打卡,leetcode,算法,java,模拟,hashmap)