前言:分治,分而治之,是一种处理问题的思路,先将大问题分解成各个子问题,再从子问题入手,二分查找算法就运用了分治的思想,将问题一分为二,如果要查找的数比中间的数小,从左边找起,反之,从右边找,不断向下分解,直到找到目标数;递归算法,最简单的理解就是函数自己调用自己,典型例子有计算阶乘、斐波拉契,递归算法也是后续学习深度优先搜索等算法的基础,这篇博客主要记录下分治思想的理解以及递归算法的学习。
思维导图
分治:分解大问题,分析子问题,处理子问题,合并结果,返回结果
递归的本质是循环,函数自己去调用自己。
计算阶乘
n!=1*2*3...*n
def Factorial(n):
if n <= 1:
return 1
return n * Factorial(n-1)
斐波拉契:
时间复杂度2^n
def fib(n):
if n == 0 or n == 1:
return n
return fib(n-1)+fib(n-2)
力扣50 计算x的n次方
解题思路
1、暴力解题,一个一个乘,乘以n次,O(N)
2、一分为二
n是奇数:先算完左边的y=x的(n-1)/2次方,再用y*y*x --->(n-1)/2取整 n/2
n是偶数,先算完左边y=x的n/2次方,再用y*y
时间复杂度O(logn)
此题也可以用位运算去解,具体可移步算法篇之(位运算)
Python代码解题:
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
if not n:
return 1
if n < 0:
return 1 / self.myPow(x, -n)
if n % 2:
return x * self.myPow(x, n-1)
return self.myPow(x*x, n/2)
力扣169 多数元素
解题思路:
1、暴力解题,时间复杂度O(n^2)
2、用map,写一层循环,将所有元素放到map中,计算count值,时间复杂度O(n)
3、数组排序,O(nlog(n))
4、分治解法,分解,分别从left、right找最大值,比较left和right,返回最大值,时间复杂度O(nlog(n))