矩阵连乘问题算法思想_LeetCode分治算法

50.实现指数相乘,指数暂不考虑浮点数

这个很容易想到折半相乘,不过就是不为2的倍数的时候要稍微处理一下。不是2的倍数的时候可以这样想,每个数多出来的那部分(不能做连乘

)刚好就是当前连乘的那一部分(多出来一个)
def myPow( x, n):
    i = n
    if i<0: i = -i
    result = 1
    while i != 0:
        if i % 2 != 0: res *= x
        x *= x
        i = i // 2
    return result if n > 0 else 1 / result

其实没想到,应该是把问题分为整除2和不能整除2的情况“分治”解决递归。

defdef myPow(x, n):
    if n < 0:
        x = 1 / x
        n = -n
    if n == 0:
        return 1
    # 两种情况
    if n%2 == 1:
        result = x * myPow(x, n-1)
        return result
    return myPow(x*x, n / 2)

53. 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

这个题目就好像那些找到连续的几个不重复序列之类的。这里的话就要注意是子序列的和小于等于0则不考虑,而不是说项小于0就不考虑。

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

看到评论有大神用类似于贪心算法的思想,记录一下。太巧秒了!用每一个元素来保存之前的最大序列的和。

def mySum(l):
    for i in range(1, len(nums)):
        nums[i] = nums[i] + max(nums[i-1], 0)
    return max(nums)

169. 给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋ 的元素。

这个直接遍历和用dict也可以,不过就是性能太差了。

e36b7e2932808e4b822461ed942ae7a4.png

直接用collections.Counter,那就更简单了。

其实list还有个sort的方法,从小到大排序或者是从大到小。那么针对这个问题,排序后中间的肯定是众数。

def majorityElement1(nums):
    nums.sort()
    print(nums)
    return nums[(len(nums)//2)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值