首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数的时空复杂度

递归函数的时空复杂度
EN

Stack Overflow用户
提问于 2020-03-16 23:59:44
回答 1查看 477关注 0票数 0

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

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

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

示例:

代码语言:javascript
复制
Input: ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

解决方案1:

代码语言:javascript
复制
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)来保持递归堆栈。

Solution2:

代码语言:javascript
复制
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

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

有人能解释一下为什么方案2的空间复杂度是O(1),而方案1的空间复杂度是O(n)吗?

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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-17 00:50:52

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60709257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档