【Leetcode周赛--哈希表数对】6164.数位和相等数对的最大和

文章目录

  • Leetcode 6164.数位和相等数对的最大和
    • 1.问题描述
    • 2.解决方案
      • 解法一:暴力
      • 解法二:哈希表

Leetcode 6164.数位和相等数对的最大和

1.问题描述

【Leetcode周赛--哈希表数对】6164.数位和相等数对的最大和_第1张图片

2.解决方案

解法一:暴力

暴力遍历所有数对,然后判断每一个数对是否数位和相等,如果相等,更新最大值(有些大的样例,超时了)

class Solution {
    Integer max = Integer.MIN_VALUE;
    public void judge(int a, int b){
        String str1 = Integer.toString(a);
        String str2 = Integer.toString(b);
        Integer sum1 = 0, sum2 = 0;
        for(char c : str1.toCharArray()){
            sum1 += Integer.parseInt(String.valueOf(c));
        }
        for(char c : str2.toCharArray()){
            sum2 += Integer.parseInt(String.valueOf(c));
        }
        if(sum1==sum2) max = Math.max(max, a+b);
    }
    public int maximumSum(int[] nums) {
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                judge(nums[i], nums[j]);
            }
        }
        return Math.max(max, -1);
    }
}

解法二:哈希表

哈希存储 [key:数位和(9),value:数字(18) ],后面有数位和一样的,就去更新最大值,并且把更大的数字留在map里面,方便后面的再出现数位和一样的,能和最大的数字相加,更新最大值。

class Solution {
    public int numSum(int a){
        String str = Integer.toString(a);
        int sum = 0;
        for(char c : str.toCharArray()){
            sum += Integer.parseInt(String.valueOf(c));
        }
        return sum;
    }
    public int maximumSum(int[] nums) {
        int max = Integer.MIN_VALUE;
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i : nums){
            int key = numSum(i);
            if(!map.containsKey(key)){
                map.put(key, i);
            }else{
                int value = map.get(key);
                max = Math.max(max, value+i);
                if(i>value){
                    map.put(key, i);
                }
            }
        }
        return Math.max(max, -1);
    }
}

你可能感兴趣的:(#,哈希,leetcode,散列表,数据结构)