递归
特征
- 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
- 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。
解决递归问题三步曲
- 第一步,定义函数功能
- 第二步,寻找递归终止条件
- 第二步,递推函数的等价关系式
递归存在的问题
- 递归调用层级太多,导致栈溢出问题
- 递归重复计算,导致效率低下
「题目:」 翻转一棵二叉树。
https://leetcode-cn.com/problems/invert-binary-tree/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class Solution { public TreeNode invertTree(TreeNode root) { if (root == null || (root.left == null && root.right == null)) { return root; } invertTree(root.left); invertTree(root.right); TreeNode temp = root.left; root.left = root.right; root.right = temp; return root; } }
|
字符串相关
BF算法(Brute Force)
我们将模式串和主串进行比较,一致时则继续比较下一字符,直到比较完整个模式串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public int strStr(String haystack, String needle) { char[] haystackChars = haystack.toCharArray(); char[] needleChars = needle.toCharArray(); if (haystackChars.length < needleChars.length || StringUtils.isBlank(haystack) || StringUtils.isBlank(needle)) { return -1; } for (int i = 0; i < haystackChars.length; i++) { int j; for ( j= 0; j < needleChars.length; j++) { if (haystackChars[i+j] != needleChars[j]) { break; } } if (j == needleChars.length) { return i; } } return -1; }
|