Day04 分治 递归 | 50. Pow(x, n)、22. 括号生成
一、50. Pow(x, n)
题目
实现 pow(x, n) ,即计算 x
的整数 n
次幂函数(即,xn
)。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
1、思路
分治:
- 折半递归 →
temp = myPow(x, n/2)
- 平方 →
ans = temp * temp
- 奇数再 补乘一个 x →
ans *= x
2、代码
class Solution {public double myPow(double x, int n) {if (n == 0) {return 1;}// 避免出界if (n == -(1l << 31)) {return 1.0 / myPow(x, -(n + 1)) * x;}if (n < 0) {return 1.0 / myPow(x, -n);}double temp = myPow(x, n / 2);double ans = temp * temp;if (n % 2 == 1) {ans = x * ans;}return ans;}
}
二、22. 括号生成
题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
1、思路
固定最外层括号,把问题拆成左右两份,递归到底再拼回来,自然不重不漏
2、代码
class Solution {public List<String> generateParenthesis(int n) {//1.边界if (n == 0){return Arrays.asList("");}List<String> ans = new ArrayList<String>();//2.为避免重复,在划分时可以用括号固定一边,例如(A)B,保证唯一for (int k = 1; k <= n; k++) {List<String> A = generateParenthesis(k - 1);List<String> B = generateParenthesis(n - k);for (String a : A) {for (String b : B) {ans.add("(" + a + ")" + b);}}}return ans;}}