力扣打卡 2342-数位和相等数对的最大和

Problem: 2342. 数位和相等数对的最大和

思路

首先暴力解法在数据量不大的情况下是一定可行的,两层for循环遍历每一种匹配可能,自己写一个计算数位和的工具函数。但是时间复杂度来到了 O ( n 2 ) O(n^2) O(n2),题目用例的数据到10^5的级别就会超时。

优化:

维护一个哈希表,建立 元素的数位和=>元素的映射,遍历数组中的元素,每遍历到一个求它的数位和,并且判断在哈希表中有没有已经存在的key值等于它的数位和的,如果有,更新保留最大结果并且存入更大的元素在同一个key上。遍历完成后结果一定是最大的。

解题方法

  1. 创建一个HashMap对象map,用于存储数位和和对应的最大值。

  2. 遍历输入数组nums中的每个元素:

    1. 获取当前数字的数位和,即调用getShuWeiHe方法。

    2. 检查map中是否已经存在该数位和:

      1.如果存在,更新res当前数位和对应的最大值加上当前数字的和的较大值

      2.更新map中该数位和对应的最大值为当前数位和对应最大值和当前数字的较大值。

      3.如果不存在,将当前数位和和当前数字存入map中。

  3. 返回最大和res作为结果。

复杂度

  • 时间复杂度:
    O ( n l o g m ) O(nlogm) O(nlogm)
    求数位和的函数时间复杂度大约在 O ( l o g m ) O(logm) O(logm),m是数字的位数。
    遍历长度为n的数组。

  • 空间复杂度:
    O ( n ) O(n) O(n)
    使用了一个哈希表 map 来存储数位和和对应的最大值。
    在最坏情况下,哈希表中可能会存储所有不同的数位和,因此空间复杂度为 O(n)。
    除了输入和输出变量之外,没有使用额外的空间。

Code

class Solution {
    public int maximumSum(int[] nums) {
        int res = -1;
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : nums){
            int shuweihe = getShuWeiHe(num);

            if(map.containsKey(shuweihe)){
                res = Math.max(res,map.get(shuweihe) + num);
                map.put(shuweihe, Math.max(num,map.get(shuweihe)));
            }else{
                map.put(shuweihe, num);
            }
        }
        return res;
    }
    //获取数位和
    public int getShuWeiHe(int n){
        int res = 0;
        while(n != 0){
            res += n % 10;
            n = n / 10;
        }
        return res;
    }
}

你可能感兴趣的:(leetcode)