问题描述
我接受了采访,我真的想知道这个问题的时间和空间复杂度 我相信这个问题的时间复杂度是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)。