微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以下解决方案的时间和空间复杂度是多少

如何解决以下解决方案的时间和空间复杂度是多少

嗨,我编写了以下代码来查找与目标总和匹配的第一对数字。我对 BigO 表示法有一个合理的想法,但我发现在下面的场景中很难。

fun twoNumberSum(array: MutableList<Int>,targetSum: Int): List<Int> {
    val end = array.size-1
    var i=0
    while(i <= end){    
        val firstNum = array[i]
        var j = i+1
        while(j <= end){
            val secondNum = array[j]
            if(firstNum + secondNum == targetSum){
             return listof(firstNum,secondNum)  
            }
            j++
        }
        i++
    }

    return listof<Int>()
}

我认为的另一种解决方案是首先对数组进行排序并对其进行大约 O(nlog(n)T 和 O(1)S 的迭代。哪个是优化的?

解决方法

您的代码的时间复杂度O(n^2)。这是您的代码:

val end = array.size-1
var i=0

//It should be end-1 
while(i <= end-1)
{    
    val firstNum = array[i]
    var j = i+1
   
    while(j <= end)
    {
        val secondNum = array[j]
        if(firstNum + secondNum == targetSum) return listOf(firstNum,secondNum)  
    
        j++
    }

    i++
}

您有一个外循环,它运行 n-1 次,其中 n 是输入数组的长度。让我们看看有多少内循环执行的次数:

 i      j
 1     n-1
 2     n-2
 3     n-3
 .      .
 .      .
 .      .
n-1     1

如果对 j 循环执行的次数求和,您会得到一个函数,该函数显示了 n 函数的增长率:

= 1 + 2 + 3 + 4 + 5 + ... + n-2 + n - 1 
= (n-1)*(n-2)/2
= (n^2 - 3n + 2)/2

忽略常量和低阶项 3n,因为它们在变得足够大时无关紧要。我们得到 {{1} 的时间复杂度 }.

由于您只使用三个额外变量,您的代码的空间复杂度O(n^2)


问题的答案:

我认为的另一种解决方案是首先对数组进行排序并进行迭代 在它上面大约 O(1)O(n*log(n)T .. 哪个是 优化一个?

是的,您的问题存在一个时间复杂度O(1)S 的解决方案。这是非常流行的解决方案。它可以在线获得。它使用 O(n*log n)

空间复杂度会发生变化,这取决于您使用的排序算法类型。


希望对你有所帮助。 如果我的解释有任何问题,请发表评论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。