Algorithm 以下解决方案的时间和空间复杂度是多少
嗨,我写了下面的代码来查找与目标和匹配的第一对数字。我对BigO符号有一个合理的想法,但我发现在下面的场景中很难做到Algorithm 以下解决方案的时间和空间复杂度是多少,algorithm,kotlin,data-structures,big-o,Algorithm,Kotlin,Data Structures,Big O,嗨,我写了下面的代码来查找与目标和匹配的第一对数字。我对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] v
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>()
}
funtwonumbersum(数组:可变列表,targetSum:Int):列表{
val end=array.size-1
变量i=0
而(i代码的时间复杂度是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++
}
如果对j
循环执行的次数求和,则得到一个函数,该函数显示n
函数的增长率:
忽略常数和低阶项3n
,因为它们在足够大的时候并不重要。我们得到的时间复杂度为O(n^2)
由于只使用三个额外变量,因此代码的空间复杂度为O(1)
你的问题的答案是:
我认为另一个解决方案是首先对数组排序并迭代
在它上面大约是O(n*log(n)T
和O(1)S
。哪个是
优化的一个
是的,您的问题存在一个时间复杂度为O(n*logn)
的解决方案。这是一个非常流行的解决方案。它可以在线获得。它使用双指针技术
空间复杂度将发生变化,这取决于您使用的排序算法的类型
我希望我已经帮到你了。我的解释有什么问题吗?你的代码的时间复杂度是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++
}
如果对j
循环执行的次数求和,则得到一个函数,该函数显示n
函数的增长率:
忽略常数和低阶项3n
,因为它们在足够大的时候并不重要。我们得到的时间复杂度为O(n^2)
由于只使用三个额外变量,因此代码的空间复杂度为O(1)
你的问题的答案是:
我认为另一个解决方案是首先对数组排序并迭代
在它上面大约是O(n*log(n)T
和O(1)S
。哪个是
优化的一个
是的,您的问题存在一个时间复杂度为O(n*logn)
的解决方案。这是一个非常流行的解决方案。它可以在线获得。它使用双指针技术
空间复杂度将发生变化,这取决于您使用的排序算法的类型
我希望我能帮助你。请评论我的解释是否会给你带来任何问题。代码不是java,请编辑你的问题Kotlin与java相似,它与java 100%可互操作,java社区很大,我会从他们那里得到一些帮助,所以我将其标记为java。.代码不是java,请编辑你的问题Kotlin是similaR to java和它的100%可与java和java社区交互,我会从他们那里得到一些帮助,所以我把它标记为java。谢谢你的详细解释。所以如果我理解正确,即使每次J迭代它会减缩一个大小,但是我们仍然需要考虑它作为O(n)谢谢你的解释O(n ^ 2)。是坏的我会用排序的方法only@Jess你不需要考虑它<代码> o(n)< /代码>。正确的说法是,如果你<代码>总结< /代码>,<代码> j <代码>循环执行所有可能的值<代码> i <代码>,然后导致一个表达式,它有<代码> n^ 2 术语。因此,<代码> O(n ^ 2)
。使用反勾号格式化代码和数学表达式是可以的,但请不要将其用于短语,如“时间复杂性”或“三个额外变量”。这只会使您的答案更难阅读。我建议您编辑以改进格式。@kaya3我编辑了我的答案以提高其可读性。@AKSingh这是我见过的格式良好的答案之一。感谢您的时间!感谢您的详细解释。。因此,如果我理解正确,即使每次j迭代,它也会消失创建大小的一个,但我们仍然需要考虑它作为O(n)感谢您的解释O(n ^ 2)是坏的,我将使用排序方法only@Jess你不必考虑它<代码> o(n)。正确的说法是,如果您将对j
循环对i
的所有可能值执行的所有时间进行总结,那么它将导致一个表达式,该表达式具有n^2
项。因此,O(n^2)
。使用反勾号格式化代码和数学表达式是可以的,但请不要将其用于短语,如“时间复杂性”或“三个额外变量”。这只会使你的答案更难阅读。我建议你编辑以改进格式。@kaya3我编辑我的答案以提高其可读性。@AKSingh这是我见过的格式良好的答案之一。感谢你的时间!
= 1 + 2 + 3 + 4 + 5 + ... + n-2 + n - 1
= (n-1)*(n-2)/2
= (n^2 - 3n + 2)/2