[算法] 求环形数组中和值最大子段
2013-10-30 14:16
302 查看
对于非环形数组,求解和值最大子段的方法见之前一遍文章;
对于环形数组,需要考虑最大和值子段越过首尾边界的情况,解决方法比较简单,即将数组处理两遍; 需要注意子段长度不可以超过整个数组长度;
注:红字部分是为处理环形数组而修改的代码
对于环形数组,需要考虑最大和值子段越过首尾边界的情况,解决方法比较简单,即将数组处理两遍; 需要注意子段长度不可以超过整个数组长度;
#! -*- coding: utf-8 -*- loop = (4, -3, 2, -4, 1, 5, -3, -4, 3) #loop = (4, 3, 2, 4, 1, 5, 3, 4, 3) #loop = (-4, -3, -2, -4, -1, -5, -3, -4, -3) # 求解和值最大子段 # 算法关键是将和值对整体不利的子序列舍弃,修减问题树 # 复杂度O(n) # 为处理循环数组,遍历数组两遍,注意子段长度是否达到了数组长度 def big_sub(): try_sum = 0 try_start = 0 length = 0 # try_length = 0 # start = 0 end = 0 sum = 0 big = loop[0] big_index = 0 for index in range(0, 2*len(loop)): # i = index % len(loop) # if try_sum >= 0: try_sum += loop[i] try_length += 1 # if (try_sum > sum): sum = try_sum length = try_length # if length >= len(loop): # break # end = i start = try_start else: # try_sum < 0 try_sum = loop[i] try_start = i try_length = 1 # if loop[i] > big: big = loop[i] big_index = i if sum == 0: sum = big start = end = big_index if start <= end and length < len(loop): # print loop[start:end+1], elif length >= len(loop): print loop, else: # print loop[start:], print loop[:end+1], print sum big_sub()
注:红字部分是为处理环形数组而修改的代码
相关文章推荐
- 求数组最大子段和的常用算法
- 连续子数组最大和或最大子段和的求解算法及其正确性
- 最大子段和系列(二维子段和、环形数组子段和、最大m段和) 思路
- 算法题之——连续子数组最大和
- 数组连续最大子和及环形数组最大子和
- 【算法之数组(一)】求子数组最大和的解决方法详解
- 蓝桥杯练习系统算法训练——求数组最大值
- [算法题] 求数组的子数组之和的最大值
- 求一个有正有负的数组的最大子段和
- 最大子数组 三种不同复杂度的算法
- 51nod 循环数组最大子段和(动态规划)
- 算法题——数组内有序对的最大距离
- 最大子段和O(n)算法;不是动态规划;思路挺独特;
- 算法习题4:求子数组的最大和
- 算法导论之动态规划之最大子数组
- 微软算法100题03 求子数组的最大和
- 一种寻找数组中和为最大的子数组的算法
- 从数组中查找出最大最小两数的log(n)算法
- 算法 (连续)子数组的最大和(及起始点)
- 循环数组最大子段和