博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大子序列系列问题
阅读量:4991 次
发布时间:2019-06-12

本文共 4242 字,大约阅读时间需要 14 分钟。

最大子序列原始问题是指一串连续的数字,从中找出和最大的连续字串的和。

此处列出一些简单的解法以及关于这个问题的一些衍生问题。

 

O(N3)解法:

1 public class MaxSubsequenceSum 2 { 3     public static int getMaxSubsequenceSum(int[] array) 4     { 5         int maxSum = 0; 6  7         for(int i = 0; i < array.length; i++) 8             for(int j = i; j < array.length; j++) 9             {10                 int thisSum = 0;11 12                 for(int k = i; k <= j; k++)13                     thisSum += array[k];14 15                 if(thisSum > maxSum)16                     maxSum = thisSum;17             }18 19         return maxSum;20     }21 }

 

O(N2)解法:

1 public class MaxSubsequenceSum 2 { 3     public static int getMaxSubsequenceSum(int[] array) 4     { 5         int maxSum = 0; 6  7         for(int i = 0; i < array.length; i++) 8         { 9             int thisSum = 0;10 11             for(int j = i; j < array.length; j++)12             {13                 thisSum += array[j];14 15                 if(thisSum > maxSum)16                     maxSum = thisSum;17             }18         }19 20         return maxSum;21     }22 }

 

O(NlogN)解法(递归解法):

1 public class MaxSubsequenceSum 2 { 3     public static int getMaxSubsequenceSum(int[] array, int left, int right) 4     { 5         if(left == right) 6             if(array[left] > 0) 7                 return array[left]; 8             else 9                 return 0;10 11         int center = (left + right) / 2;12         int maxLeftSum = getMaxSubsequenceSum(array, left, center);13         int maxRightSum = getMaxSubsequenceSum(array, center + 1, right);14 15         int maxLeftBorderSum = 0, leftBorderSum = 0;16         for(int i = center; i >= left; i--)17         {18             leftBorderSum += array[i];19             if(leftBorderSum > maxLeftBorderSum)20                 maxLeftBorderSum = leftBorderSum;21         }22 23         int maxRightBorderSum = 0, rightBorderSum = 0;24         for(int i = center + 1; i <= right; i++)25         {26             rightBorderSum += array[i];27             if(rightBorderSum > maxRightBorderSum)28                 maxRightBorderSum = rightBorderSum;29         }30 31         return Math.max(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);32     }33 }

 

O(N)解法:

1 public class MaxSubsequenceSum 2 { 3     public static int getMaxSubsequenceSum(int[] array) 4     { 5         int thisSum = 0; 6         int maxSum = 0; 7  8         for(int i = 0; i < array.length; i++) 9         {10             thisSum += array[i];11 12             if(thisSum > maxSum)13                 maxSum = thisSum;14             else if(thisSum < 0)15                 thisSum = 0;16         }17 18         return maxSum;19     }20 }

 

以上是对于最大子序列和的几种解法,以下有一些相关问题:

最小子序列:

1 public class MinSubsequenceSum 2 { 3     public static int getMinSubsequenceSum(int[] array) 4     { 5         int thisSum = 0; 6         int minSum = 0; 7  8         for(int i = 0; i < array.length; i++) 9         {10             thisSum += array[i];11 12             if(thisSum < minSum)13                 minSum = thisSum;14             else if(thisSum > 0)15                 thisSum = 0;16         }17 18         return minSum;19     }20 }

 

最小正子序列:

1 public class MinPositiveSubsequenceSum 2 { 3     public static int getMinPositiveSubsequenceSum(int[] array) 4     { 5         int thisSum = 0; 6         int minPositiveSum = array[0]; 7  8         for(int i = 0; i < array.length; i++) 9         {10             thisSum += array[i];11 12             if(thisSum < minPositiveSum && thisSum > 0)13                 minPositiveSum = thisSum;14             else if(thisSum < 0)15                 minPositiveSum = 0;16         }17 18         return minPositiveSum;19     }20 }

 

最大乘积子序列:

1 public class MaxSubsequenceProduct 2 { 3     public static int getMaxSubsequenceProduct(int[] array) 4     { 5         int thisProduct = 1; 6         int maxProduct = 1; 7  8         for(int i = 0; i < array.length; i++) 9         {10             thisProduct *= array[i];11 12             if(thisProduct > maxProduct)13                 maxProduct = thisProduct;14             else if(thisProduct < 1)15                 thisProduct = 1;16         }17 18         return maxProduct;19     }20 }

 

转载于:https://www.cnblogs.com/wood-python/p/5806546.html

你可能感兴趣的文章
matlab演奏卡农 Cripple Pachebel's Canon on Matlab
查看>>
apache的MPM机制-prefork
查看>>
js的一些实用的小技巧
查看>>
vue-cli中理不清的assetsSubDirectory 和 assetsPublicPath
查看>>
iOS的UILabel设置居上对齐,居中对齐,居下对齐
查看>>
最流行的android组件大全
查看>>
【Android自定义控件】支持多层嵌套RadioButton的RadioGroup
查看>>
Swift - 内存泄露原因(循环强引用)及解决办法
查看>>
AIDL-Android接口描述语言实现跨进程通讯
查看>>
剑指Offer - 九度1354 - 和为S的连续正数序列
查看>>
LeetCode - Anagrams
查看>>
用MFC时,如果程序崩溃,检查内存,然后注意GDI数量,在任务管理器里选项-查看列-GDI数量...
查看>>
angular(转)
查看>>
ansible简单现网配置
查看>>
数据结构C++版-树
查看>>
JavaScript学习总结--创建对象(3_原型)
查看>>
FZU 2092 收集水晶 dp+bfs
查看>>
Java学习---网页编辑器FCKeditor使用详解
查看>>
IDEA开发React环境配置
查看>>
香港两日游
查看>>