LeetCode探索--递归(递归原理)

在这张探索卡片中,我们回答了以下几个问题:

  • 什么是递归?它是如何工作的?
  • 如何递归地解决问题?
  • 如何分析递归算法的时间和空间复杂度?
  • 如何更好地运用递归?

一、 递归原理

递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用

你可能想知道如何实现调用自身的函数。诀窍在于,每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题无需进一步递归就可以解决的地步。

为了确保递归函数不会导致无限循环,它应具有以下属性:

一个简单的基本案例(basic case)(或一些案例) —— 能够不使用递归来产生答案的终止方案。
一组规则,也称作递推关系(recurrence relation),可将所有其他情况拆分到基本案例。
注意,函数可能会有多个位置进行自我调用。

二、反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

分析:
我们实现递归函数 helper,它接受三个参数:数组s,left 左指针和 right 右指针。
如果 left>=right,不做任何操作。
否则交换 s[left] 和 s[right] 和调用 helper(s,left + 1, right - 1)。
首次调用函数我们传递首尾指针反转整个字符串 helper(s,0, len(s) - 1)。

class Solution {
    public void reverseString(char[] s) {
        helper(s,0,s.length-1);
    }
    public void helper(char[] s,int left,int right){
        if(left>=right) return;
        char tmp = s[left];
        s[left++] = s[right];
        s[right--] = tmp;
        helper(s,left,right);
    }
}

时间复杂度:O(n)。执行了n/2次的交换。
空间复杂度:O(n),递归过程中使用的堆栈空间。

发布了9 篇原创文章 · 获赞 0 · 访问量 124

猜你喜欢

转载自blog.csdn.net/DLC990319/article/details/104472158
今日推荐