当前位置: 首页 > 知识库问答 >
问题:

这个java递归函数的时间复杂度是多少?

陶征
2023-03-14
class Solution {
    public static int countBinarySubstrings(String s) {
        int res = 0;
        for(int i = 0; i < s.length()-1; i++) {

            if(s.charAt(i) != s.charAt(i+1)) 
                res += countValid(s, i, i+1);
        }
        return res;
    }
    
    public static int countValid(String s, int start, int end) {
        //base case
        if(start < 0 || end >= s.length()) 
            return 0;
        if(end-start == 1)
            return countValid(s, start-1, end+1) + 1;
        if(s.charAt(start+1) == s.charAt(start) && s.charAt(end-1) == s.charAt(end))
            return countValid(s, start-1, end+1) + 1;
        else
            return 0;
    }
    
}

Leetcode问题https://leetcode.com/problems/count-binary-substrings/

该解决方案有效,但我很难提出递归解决方案的时间复杂度。

每当循环遇到s.charAt(i)!=s.charAt(i 1)时,它都会进行递归调用以展开,直到达到基本大小写或其他部分。

因为我遍历整个字符串,所以for循环是O(n)。但是如何确定将进行的递归调用的数量,因为它将取决于if条件。

至于空间复杂度,最坏的情况发生在s=“00…000011111…11”时。在本例中,01正好出现在中间,因此递归调用将继续扩展,直到开始索引和结束索引超出界限。到那时,代码将进行n/2次调用,因此空间复杂度为O(n)。

我被困在时间复杂度上。

共有1个答案

乐正乐湛
2023-03-14

首先,考虑任何给定的顶级调用isValid()

我们可以看到它调用自己的模式。它从可以假设为字符串中间的某个地方开始,并不断扩展边界,直到它们超出范围或数字不再匹配。在最坏的情况下(从中间开始并一直延伸到结尾,这导致调用方法n/2次,即时间复杂度类O(n)

现在,我们可以考虑count tBinarySubstring(),它调用isValid()n次。O(n*n)=O(n^2)

就空间复杂度而言,在countBinarySubstrings()中只分配了一个整数,在countValid()中没有分配空间。在方法的空间复杂度中,我们通常不计算方法调用本身占用的堆栈空间,也不计算输入本身占用的空间,因此我们可以说这具有O(1)space complextiy(或O(n)如果要从递归调用中计算堆栈空间)。

请记住,O表示法记录过程的最坏情况复杂性。Ω表示法记录最佳情况,θ表示法记录平均情况复杂性,这通常有点难以计算,但我们通常不太关心它。

 类似资料:
  • 我正在学习算法和数据结构课程。 今天,我的教授说下面算法的复杂度是2n。 我一直等到课程结束,走近他,告诉他我真的相信这是一个O(n)算法,我做了计算来证明它,并想给他们看,但他继续说它不是,没有给我任何令人信服的解释。 该算法是递归的,具有以下复杂性: 我计算它是一个,这样: 让我们展开 当T中的项为1时,我们停止,即: n/(2i)=1== 替换后,我们获得 由于该算法是从关于合并排序的课程中

  • 我有一个使用递归打印斐波那契级数的程序。有更好的方法,但我被要求使用递归,所以我不得不这样做。 这是程序: 我知道这对于斐波那契级数来说真的是一种糟糕的方法,从上面可以清楚地看出,当项超过35时,程序需要很多时间才能完成。 我看了这个答案,不明白他们是怎么解决的,但看起来 fibo(int n)的时间复杂度为O(2^n) 我可能完全错了,但我只想: 这个完整程序的时间复杂度是多少,简要解释一下您是

  • 我有一个算法可以检查是否可以解决游戏行。游戏行是一个正整数数组,其中最后一个元素为 0。游戏标记从索引 0 开始,沿着数组移动它所在的整数指示的步数。 例如,[1,1,0]返回true,而[1,2,0]返回false。标记也可以向左或向右移动以解决游戏。也就是说,[3,3,2,2,0]是可解的。 我尝试了一些游戏行示例,并计算了最坏情况下的时间复杂度: 其他情况下给我的数字,我找不到与输入大小的关

  • 顺便说一句,我试图解决时间复杂性,我找到了O(2^n)。正确吗?

  • 好的,第一个for循环显然是。第一个迭代是,第二个迭代是。我想是不是就像那个次数?这意味着。我说对了吗? 编辑:(不是复制品)我知道大O是什么。我在一个具体的案例中询问了正确的评估。