简谈最大子数组和

1 最大子数组和问题

最大子数组肯定不会有一个负的子数组前缀
这里首先将前缀置为0

def fun(z):
    if len(z) == 0:
        return
    tem_sum = 0
    final_sum = -0x3fffffff
    for i in range(len(z)):
        if tem_sum + z[i] > final_sum:
            final_sum = tem_sum + z[i]
        if tem_sum + z[i] > 0:
            tem_sum = tem_sum + z[i]
        else:
            tem_sum = 0
    return final_sum
a = [1,2,3]
fun([-1,-2,-3])
-1
fun([0,1])
1

2返回最大字数组和以及这个子数组

1 如果之前的和加上当前的元素大于最大和,则更新final_sum,final_up,final_down
2 如果tem_sum + 当前元素 > 0,那么tem_sum更新为tem_sum + 当前元素,否则tem_sum = 0,down = 当前位置的下一个

def fun(z):
    if len(z) == 0:
        return
    tem_sum = 0
    final_sum = -0x3fffffff
    up = 0
    down = 0
    final_up = 0
    final_down = 0
    for i in range(len(z)):
        if tem_sum + z[i] > final_sum:
            final_sum = tem_sum + z[i]
            final_up = i
            final_down = down
            print final_sum,z[final_down:final_up+1]
        if tem_sum + z[i] > 0:
            tem_sum = tem_sum + z[i]
        elif tem_sum + z[i] < 0:
            tem_sum = 0
            down = i + 1
        elif tem_sum + z[i] == 0:
            tem_sum = 0
            down = i + 1 
    return final_sum,z[final_down:final_up+1]
fun([1,2,3])
1 [1]
3 [1, 2]
6 [1, 2, 3]





(6, [1, 2, 3])
fun([-1,-2,-3])
-1 [-1]





(-1, [-1])
fun([-1,0,1,0,2,-3])
-1 [-1]
0 [0]
1 [1]
3 [1, 0, 2]





(3, [1, 0, 2])
fun([-1,0,0,1,2,3,-3])
-1 [-1]
0 [0]
1 [1]
3 [1, 2]
6 [1, 2, 3]





(6, [1, 2, 3])
fun([1,-1,2,3])
1 [1]
2 [2]
5 [2, 3]





(5, [2, 3])
fun([-3,-2,-1])
-3 [-3]
-2 [-2]
-1 [-1]





(-1, [-1])
b = 0
a = b
b = 1
print a
0
[1,2,3][0:2]
[1, 2]
[1,2,3][0:3]
[1, 2, 3]
print -0x3fffffff
-1073741823
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值