Leetcode学习--分治(8.18-8.19)

分治

一、主要思想

1)、 分治算法的主要思想是将一个大问题递归的分为若干个小问题,然后再对小问题逐个击破,最后算法再层层合并为原来的大问题。简而言之就是分而治之。
2)、伪代码

def divide_conquer(problem, paraml, param2,...):
    # 不断切分的终止条件
    if problem is None:
        print_result
        return
    # 准备数据
    data=prepare_data(problem)
    # 将大问题拆分为小问题
    subproblems=split_problem(problem, data)
    # 处理小问题,得到子结果
    subresult1=self.divide_conquer(subproblems[0],p1,..)
    subresult2=self.divide_conquer(subproblems[1],p1,...)
    subresult3=self.divide_conquer(subproblems[2],p1,.)
    # 对子结果进行合并 得到最终结果
    result=process_result(subresult1, subresult2, subresult3,...)

二、刷题练习

1. Pow(x, n)

1)、 Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
2)、示例:

示例 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

3)、思想:
求x的n次幂可以将其分解为求x的n/2次幂和x的n/2次幂的乘积,对于x的n/2次幂同样可以拆分为两个x的n/4次幂的乘积。以此类推将x的n次幂递归的拆分并求结果,最后再合并。需要注意的是n=0的情况以及n为负数的情况。

4)、代码

class Solution(object):
    def myPow(self, x, n):
        # 处理n为负的情况
        if n < 0 :
            x = 1/x
            n = -n
        # 当切分到n=0时,切分终止
        if n == 0 :
            return 1
        # 将大问题切分为小问题
        if n%2 ==1:
          # 计算每一个子问题
          # 递归调用
          p = x * self.myPow(x,n-1)
          return p
        return self.myPow(x*x,n/2)

5)、来源
力扣(leetcode):https://leetcode-cn.com/problems/powx-n/

2. 最大子序和

1)、最大子序和:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
2)、示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

3)、思想:
本题采用动态规划的思想。将指针i从头开始遍历元素,如果前i-1个元素之和大于0,那么就将指针i所指的第i个元素与之前的相加。若前i-1个元素之和小于0,则不相加,保持当前的元素不变。最后取和最大的那个数组。
4)、代码:

class Solution(object):
    def maxSubArray(self, nums):
    	"""
        :type nums: List[int]
        :rtype: int
        """
        #如果数组不存在,返回零
        if not nums:
            return 0
        #如果数组长度为1,返回数组第一个数的值
        elif len(nums)==1:
            return nums[0]
        #获取数组长度
        n = len(nums)
        #遍历数组
        for i in range(1,n):
            #如果前i个元素之和大于0
            if nums[i-1] > 0:
                #将第i个与之前的相加
                nums[i] += nums[i-1]
        #取所有数组结果中的最大值
        return max(nums)

5)、来源
力扣(leetcode):https://leetcode-cn.com/problems/maximum-subarray/

3.多数元素

1)、多数元素
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 [n/2] 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
2)、示例:

示例 1:
输入: [3,2,3]
输出: 3

示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

3)、思想:
对于本题,我认为可以设置一个字典保存当前记录的某一元素出现次数,最后返回最大值。
还有一种方法是直接先将数组排序,排序后值相同的元素都聚在一起,我们只需记录比较即可。

4)、代码:

#使用字典
class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        #设置一个字典,空值
        dicts = {}
        #遍历数组
        for i in nums:
            #记录每一个元素出现的次数
            dicts[i] = dicts.get(i,0) + 1
        #返回出现次数最多的,即众数
        return (max(dicts, key=dicts.get))

5)、来源
力扣(leetcode):https://leetcode-cn.com/problems/majority-element/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值