求数组最大字段和最简洁有效的算法
2018-03-24 18:10
141 查看
直接上代码:public static int max(int[] a){
int max = 0;int zmax = 0;
for (int i = 0;i<a.length;i++){
zmax += a[i];
if (zmax>max) {
max = zmax;
}else if (zmax<0){
zmax = 0;
}
}
return max;
}
public static void main(String[] args) {
int[] a = {3,-5,7,-1,4,10,-38};
System.out.println(max(a));
}如果在数组中检测到a[x]到a[y]的子序列是负的,那么就可以推进x,关键点在于我们不但可以把x推进到x+1点,我们可以直接推进到y+1点.没明白的话,往下看:
设p为i+1和y之间任意一个下标,以P开始的任意子序列都不大于a[x]至a[p-1]子序列,因为后面这个子序列不是负的.因此,我们可以把x直接推进至y+1位置,而且中间不会错过一个最优解.
int max = 0;int zmax = 0;
for (int i = 0;i<a.length;i++){
zmax += a[i];
if (zmax>max) {
max = zmax;
}else if (zmax<0){
zmax = 0;
}
}
return max;
}
public static void main(String[] args) {
int[] a = {3,-5,7,-1,4,10,-38};
System.out.println(max(a));
}如果在数组中检测到a[x]到a[y]的子序列是负的,那么就可以推进x,关键点在于我们不但可以把x推进到x+1点,我们可以直接推进到y+1点.没明白的话,往下看:
设p为i+1和y之间任意一个下标,以P开始的任意子序列都不大于a[x]至a[p-1]子序列,因为后面这个子序列不是负的.因此,我们可以把x直接推进至y+1位置,而且中间不会错过一个最优解.
相关文章推荐
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 算法---数组中连续子数组和最大值
- 算法--求先递增后递减数组最大值的下标
- 算法实验一:二分查找算法改进: 当搜索元素x不存在时,返回小于x的最大元素位置i和大于x的最小元素位置j. 当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
- 最大子数组 三种不同复杂度的算法
- 每天一道算法题3 求子数组的最大和
- 算法学习-数组的最大间隔
- 最大子数组和的三种算法
- 三种算法求解一个数组的子数组最大和
- java如何求最大子数组的和 蛮力算法 动态规划算法
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 关于byte数组截取有效字段的工具方法
- java 数组中两数之差的最大值 蛮力算法 动态规划及其优化
- 面试算法(三十一)连续子数组的最大和
- 6.对数组进行排序、求最大值和求元素和的函数采用静态成员函数的方式封装成数组算法类模板ArrayAlg,并采用相关数据进行测试。
- 算法导论--分治策略求解最大子数组问题
- 笔试算法题(06):最大连续子数组和 & 二叉树路径和值
- 三种算法求解一个数组的子数组最大和
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值