DataWhale - LC - 分治法

讲解

题目练习

Pow(x, n)

class Solution:

    def myPow(self, x: float, n: int) -> float:
        return self.helper(x, n) if n > 0 else 1 / self.helper(x, -n)
    
    def helper(self, x, n):
        if x == 0:
            return 0
        if n == 0:
            return 1
        y = self.helper(x, n // 2)
        return y * y if n % 2 == 0 else y * y * x 

最大子序和

动态规划解法:时间复杂度 O(N),空间复杂度 O(1)


class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return 0
        if len(nums) == 1:
            return nums[0]
        for i in range(1, len(nums)):
            if nums[i - 1] > 0:
                nums[i] += nums[i - 1]
        return max(nums)

分治法

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return 0
        if len(nums) == 1:
            return nums[0]
            
        # 求左半边的最大值
        max_left = self.maxSubArray(nums[: len(nums) // 2])
        # 求右半边的最大值
        max_right = self.maxSubArray(nums[len(nums) // 2:])
        # 求跨越中间的最大值
        # 求从左半边的右端点向左数的最大和
        temp = 0
        max_l = nums[len(nums) // 2 - 1]
        for i in range(len(nums) // 2 - 1, -1, -1):
            temp = nums[i] + temp
            max_l = max(max_l, temp)
        # 求从右半边的左端点向右数的最大和
        temp = 0
        max_r = nums[len(nums) // 2]
        for i in range(len(nums) // 2, len(nums)):
            temp += nums[i]
            max_r = max(temp, max_r)
        return max(max_r + max_l, max_left, max_right)

多数元素

  1. 思路一:哈希表 时间复杂度O(n);
  2. 思路二:排序,n / 2位置一定是多数元素 时间复杂度O(nlogn);
  3. 思路三:随机抽取一个数。该数有1/2的可能性是多数元素。抽取的数字为多数元素的数学期望为2,即O(1),但确定该数字是否为多数元素需要逐个比较,因此总的时间复杂度为O(n);
  4. 思路四:分治法
    	class Solution(object):
    	    def majorityElement(self, nums):
    	        """
    	        :type nums: List[int]
    	        :rtype: int
    	        """
    	        # 【不断切分的终止条件】
    	        if not nums:
    	            return None
    	        if len(nums) == 1:
    	            return nums[0]
    	        # 【准备数据,并将大问题拆分为小问题】
    	        left = self.majorityElement(nums[:len(nums)//2])
    	        right = self.majorityElement(nums[len(nums)//2:])
    	        # 【处理子问题,得到子结果】
    	        # 【对子结果进行合并 得到最终结果】
    	        if left == right:
    	            return left
    	        if nums.count(left) > nums.count(right):
    	            return left
    	        else:
    	            return right    
    

     

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值