递归函数的时空复杂度

时间:2020-03-16 15:59:44

标签: python recursion time-complexity space-complexity

这来自这里的leetcode问题:https://leetcode.com/problems/reverse-string/solution/

编写一个反转字符串的函数。输入字符串以字符数组char []形式给出。

不要为另一个数组分配额外的空间,必须通过使用O(1)额外的内存就地修改输入数组来做到这一点。

示例:

Input: ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

解决方案1:

class Solution:
    def reverseString(self, s):
        def helper(left, right):
            if left < right:
                s[left], s[right] = s[right], s[left]
                helper(left + 1, right - 1)

        helper(0, len(s) - 1)

时间复杂度:O(N)次执行N / 2次交换的时间。 空间复杂度:O(N)以保留递归堆栈。

解决方案2:

class Solution:
    def reverseString(self, s):
        left, right = 0, len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left, right = left + 1, right - 1

时间复杂度:O(N)交换N / 2个元素。 空间复杂度:O(1),它是一个恒定的空间解。

有人可以解释为什么解决方案2中的空间复杂度是O(1)而解决方案1中的空间复杂度是O(n)吗?

是因为解决方案1需要函数调用吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

当您递归调用函数时,在幕后会创建一个新的堆栈框架,以保存您在新调用中创建的返回地址和变量。

每个递归调用都执行此操作,因此,如果一个函数自身调用n / 2次,则该存储空间为O(n)。