《极客时间--算法面试》--递归和分治

目录

  递归

  分治

1、求指数

 

n的阶乘的计算法方式。

递归的必要条件

  参数里面有明显的层级,level。

  递归的终止条件。大多数在最前面

  数据的处理

  调用下一层

  解决完下一层的任务后做的工作(按需)

 分治

分治思路:

  明确问题problem

  明确终止条件

  准备数据并将大问题拆分成小问题

  对子问题进行解决

  对子结果进行合并

 Pow(x,n)

https://leetcode-cn.com/problems/powx-n/submissions/

思路:

  一、如果采用循环遍历的话,将是O(n)时间复杂度

  二、如果采用分治思想的话将是logn时间复杂度

代码:

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if n<0:                         #如果是负数幂
            x = 1/x                     #结果是倒数
            n = -n                      #将n转为正数
        Pow = 1                         #累计结果值
        while n:                        #循环遍历
            if n&1:     
                Pow *= x                #如果是奇数的话就会多乘一次
            x *= x                      #x自身累乘
            n = n>>1                    #右移是除以2
        return Pow                      #最终返回结果值

众数

https://leetcode-cn.com/problems/majority-element/submissions/

思路:

  一、采用暴力进行求解,时间复杂度为n平方

  二、采用集合统计次数,世间复杂度为O(n)

  三、采用排序的方式,平均下快排是最快的nlogn时间复杂度

  四、分治的思想

代码:

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
                                        #这个代码和下面的思路一样,更多采用了集合进行缓存
        dic = {}
        for item in nums:
            if item not in dic:
                dic[item] = 1
            else:
                dic[item] += 1
        value = 0
        for item in dic:
            if dic[item] >value:
                key = item
                value = dic[item]
        if value>len(nums)/2:
            return key
        """
        for item in set(nums):                  #遍历元素,set是去重复
            if nums.count(item)>len(nums)/2:    #对元素个数进行技术,符合条件
                return item                     #返回元素值   

 

posted @ 2019-06-19 11:09  weilongyitian  阅读(335)  评论(0编辑  收藏  举报