题目:给定一个正数数组,找到一个子数组满足条件:
1)子数组选择的元素不能包含原数组相邻元素
2)满足条件1的前提下,得到的子数组的和值最大
思路:遍历一次数组,设置两个变量:
包含当前元素的最大值 curMax
包含前一个元素的最大值preMax
在遍历过程过不断更新上述两个变量:
curMax = current +preMax' (preMax'表示上一轮中的值)
preMax = max(preMax', curMax')
具体案例数据分析:List = [2, 3, 4, 1, 9, 3, 2, 3, 3, 4]
(1)list[0] = 2 curMax = 2+ 0 = 2 preMax = max(0, 0 ) =0
(2) list[1] = 3 curMax = 3+0 = 3 preMax = max(2, 0) = 2
(3) list[2] = 4 curMax = 4 + 2 = 6 preMax = max(3, 2) =3
(4) list[3] = 1 curMax = 1 +3 =4 preMax = max(6, 3) =6
(5) list[4] = 9 curMax = 9 +6 =15 preMax = max(4, 6)=6
(6) list[5] = 3 curMax = 3 +6= 9 preMax = max(15, 6) = 15
(7) list[6] = 2 curMax = 2+15 = 17 preMax = max(9, 15) = 15
(8)list[7] = 3 curMax = 3 + 15 = 18 preMax = max(17,15) = 17
(9) list[8] = 3 curMax = 3 +17 =20 preMax =max(18,17) =18
(10) list[9] = 4 curMax = 4 +18 =22 preMax =max(20,18) = 20
result = max(curMax, preMax) = (22, 20) = 22
代码实现:
def maxList(myList):
length = len(myList)
preMax = 0
curMax = 0
temp = 0
for i in range(0, length):
temp = myList[i] + preMax
preMax = max(curMax, preMax)
curMax = temp
return max(curMax, preMax)
if __name__ == "__main__":
myList = [2, 3, 4, 1, 9, 3, 2, 3, 3, 4]
print(maxList(myList)) # 22