如何解决以下解决方案的时间和空间复杂度是多少
嗨,我编写了以下代码来查找与目标总和匹配的第一对数字。我对 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 举报,一经查实,本站将立刻删除。