Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 以下解决方案的时间和空间复杂度是多少_Algorithm_Kotlin_Data Structures_Big O - Fatal编程技术网

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

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

嗨,我写了下面的代码来查找与目标和匹配的第一对数字。我对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>()
}
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