算法篇之(递归&分治)

前言:分治,分而治之,是一种处理问题的思路,先将大问题分解成各个子问题,再从子问题入手,二分查找算法就运用了分治的思想,将问题一分为二,如果要查找的数比中间的数小,从左边找起,反之,从右边找,不断向下分解,直到找到目标数;递归算法,最简单的理解就是函数自己调用自己,典型例子有计算阶乘、斐波拉契,递归算法也是后续学习深度优先搜索等算法的基础,这篇博客主要记录下分治思想的理解以及递归算法的学习。

思维导图

分治:分解大问题,分析子问题,处理子问题,合并结果,返回结果

递归的本质是循环,函数自己去调用自己。

计算阶乘

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)

此题也可以用位运算去解,具体可移步算法篇之(位运算)

CSDN

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))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MRJJ_9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值