Leetcode\1191. K 次串联后最大子数组之和\Python

思路:求最大子数组,那么按平常思路就是在一个数组中遍历。利用cur当前值与0的关系,若大于则继续,反之重新记录cur = arr[i]


然而本题的关键在于数组串联,那么我们就不应该局限与原始数组arr。

若k=2,其中最大子数组可能跨越与两数组之间:

k > 2,那么此时需要思考其中跨越的子数组是否可以推广到第k个arr

红线代表两个数组间的子数组,为正,绿线即负数组。

若依次合并后更大,则更新

max(max_num,sum(arr)*(k) - sum(arr[:ans[0]]) - sum(arr[ans[1]-lt+1:]))

 若k=1,按照常思路即可

lt = len(arr)
mod = 1000000000 + 7
if k >= 2:
    p = arr + arr
    lt1 = 2 * lt
    cur = 0
    ans = [0,0]
    max_num = 0
    pos = 0
    for i in range(lt1):
        if cur < 0:
            cur = p[i]
            pos = i
        else:
            cur += p[i]
        if max_num <= cur:
            ans = [pos,i]
            max_num = cur
    return max(max_num,sum(arr)*(k) - sum(arr[:ans[0]]) - sum(arr[ans[1]-lt+1:])) % mod
else:
    cur = 0
    max_num = 0
    for i in range(lt):
        if cur < 0:
            cur = arr[i]
        else:
            cur += arr[i]
        if max_num <= cur:
            max_num = cur
    return max_num % mod

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值