参考博文:
1、从零开始学递归与分治 (作者:houjingyi233)
2、leetcode–递归、回溯和分治 (作者:xiayto)
3、leetcode刷题总结之递归 (作者:algsup)
还可以看一下我之前写的关于DFS的博客,加深对递归的理解:
1、深度优先算法DFS入门 (超级简单的例题入门)
2、深度优先算法(二) 一些例题加深对DFS的理解
分治问题,由**“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题**,再将子问题进行处理合并,从而实现对原问题的求解。
归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为 1 的子数组;“治”即为把已经排好序的两个小数组合成为一个排好序的大数组,从长度为 1 的子数组开始,最终合成一个大数组。
一、50. Pow(x, n)
原题链接:https://leetcode-cn.com/problems/powx-n/
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
解题思路:
主要是注意n的正负,这个题比较简单了,直接递归调用就行:
如果 n 是负数,那么相当于求 (1/x)^(-n)。
如果 n 是正数 且 奇数,那么结果需要单独乘以 x
如果 n 是正数 且 偶数,求(x2)(n/2),一直递归下去即可。
时间复杂度是O(1),空间复杂度是O(1)。
**个人觉得,这个代码是O(1),因为n只有32位,循环次数是有上限的常数。
runtime error: negation of -2147483648 cannot be represented in type ‘int’; cast to an unsigned type to negate this value to itself (solution.cpp)
解决方法:把int改为long long
class Solution {
public:
double myPow(double x, long long n) {
if(n==0) return 1; // n=0直接返回1
if(n==1) return x;
if