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