计算两个数字和等于的最大和的时空复杂度

问题描述

我接受了采访,我真的想知道这个问题的时间和空间复杂度 我相信这个问题的时间复杂度是O(nlog(n)),但我不确定,而且我很难弄清楚空间复杂度,因为它可能取决于输入。这样对吗?

fun maxSumDigits(arr : IntArray) : Int{

        val hashMap : MutableMap<Int,Int> = mutableMapOf()
        var result = -1
        for (element in arr){
            val sumDigit = digitsSum(element)

            if (hashMap.containsKey(sumDigit)){

                result = max(result,hashMap[sumDigit]?.plus(element) ?: 0)

            }
            hashMap[sumDigit] = max(element,hashMap[sumDigit] ?: 0)

        }
        System.out.println(result)
        return result

    }

    private fun digitsSum(num: Int): Int {

        var n = num
        var result = 0

        while (n > 0){
            result += n % 10
            n /= 10
        }
        return result

    }

解决方法

预计时间复杂度为O(n),这有点奇怪。机器字的大小通常被认为是恒定的,digitSum所花费的时间与-O(1)成正比。您执行n次,因此所有总和为O(n)。哈希映射操作需要O(n)个预期时间。

奇怪的是,如果存在一个规则,即所有数组元素都在0到n之间,那么任何n的最坏情况都会花更少的时间 ,但是我们会说复杂度为O(n log n),因为digitSum将是O(log n)而不是O(1)。限制输入使求和时间以对数方式取决于n。

在哈希图中存储n个最大值的空间复杂度仅为O(n)。