递归函数的时空复杂度

能人豹

这是来自此处的 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 需要函数调用吗?

提前致谢!

德斯特龙贝格

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

每个递归调用都这样做,所以如果一个函数调用自己 n/2 次,那就是 O(n) 存储空间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章