数组最长子段和java实现
来源:互联网 发布:添加sql语句 编辑:程序博客网 时间:2024/04/30 13:19
package Test;
//计算数组的最大子段和
public class lcs {
public static void main(String[] args)
{
int num[]={1,-2,3,10,-4,7,2,-5};
//int max=lcs_first(num);
//int max=lcs_fenzhi(num, 0, num.length-1);
int max=getMaxSeq(num);
System.out.print("最大子段和为:"+max);
}
public static int lcs_first(int[] num) {
// 编程之美上的做法,如果子段和为负数,则抛弃现在再算的子段和,以下一元素为头重新开始计算子段和
int sum = num[0];
int max = num[0];
for (int i = 1; i < num.length - 1; i++) {
if (sum < 0)
sum = 0;
sum += num[i];
if (sum > max)
max = sum;
}
return max;
}
//分治法,最大字段和可能在数组的左边连续部分,右边部分的连续和,以及中间部分的连续和
public static int lcs_fenzhi(int[] num,int start,int end)
{
if(start==end)
return num[start];
if(end<start){
return 0;
}
int middle=(start+end)/2;
int left=lcs_fenzhi(num, start, middle);//求出左边部分的最大值
int right=lcs_fenzhi(num, middle+1, end);//求出右边部分最大值
int sum=num[middle];
int max=num[middle];
int i=middle-1;
int j=middle+1;
while (i>=start) {
sum+=num[i];
if(sum>max)
max=sum;
--i;
}
sum=max;
while (j<=end) {
sum+=num[j];
if(sum>max)
max=sum;
++j;
}
int maxsun=left>right?left:right;
maxsun=max>maxsun?max:maxsun;
return maxsun;
}
//和第一种方法思路是一样的
public static int getMaxSeq(int[] a){ //最大连续队列
int[] sum = new int[a.length];
sum[0]=a[0]; int max = a[0];
for(int i=1;i<a.length;i++){
sum[i]=(sum[i-1]+a[i]>a[i])?sum[i-1]+a[i]:a[i]; //判断前一项是否为负值,存放最大值
max = max>sum[i]?max:sum[i]; //max记录最大值
}
return max; }
}
//计算数组的最大子段和
public class lcs {
public static void main(String[] args)
{
int num[]={1,-2,3,10,-4,7,2,-5};
//int max=lcs_first(num);
//int max=lcs_fenzhi(num, 0, num.length-1);
int max=getMaxSeq(num);
System.out.print("最大子段和为:"+max);
}
public static int lcs_first(int[] num) {
// 编程之美上的做法,如果子段和为负数,则抛弃现在再算的子段和,以下一元素为头重新开始计算子段和
int sum = num[0];
int max = num[0];
for (int i = 1; i < num.length - 1; i++) {
if (sum < 0)
sum = 0;
sum += num[i];
if (sum > max)
max = sum;
}
return max;
}
//分治法,最大字段和可能在数组的左边连续部分,右边部分的连续和,以及中间部分的连续和
public static int lcs_fenzhi(int[] num,int start,int end)
{
if(start==end)
return num[start];
if(end<start){
return 0;
}
int middle=(start+end)/2;
int left=lcs_fenzhi(num, start, middle);//求出左边部分的最大值
int right=lcs_fenzhi(num, middle+1, end);//求出右边部分最大值
int sum=num[middle];
int max=num[middle];
int i=middle-1;
int j=middle+1;
while (i>=start) {
sum+=num[i];
if(sum>max)
max=sum;
--i;
}
sum=max;
while (j<=end) {
sum+=num[j];
if(sum>max)
max=sum;
++j;
}
int maxsun=left>right?left:right;
maxsun=max>maxsun?max:maxsun;
return maxsun;
}
//和第一种方法思路是一样的
public static int getMaxSeq(int[] a){ //最大连续队列
int[] sum = new int[a.length];
sum[0]=a[0]; int max = a[0];
for(int i=1;i<a.length;i++){
sum[i]=(sum[i-1]+a[i]>a[i])?sum[i-1]+a[i]:a[i]; //判断前一项是否为负值,存放最大值
max = max>sum[i]?max:sum[i]; //max记录最大值
}
return max; }
}
0 0
- 数组最长子段和java实现
- 分治算法之最长子段和问题(Java)
- 最长子段和(动态规划)
- java 实现后缀数组及最长回文子串问题
- LCP数组的实现和最长公共连续子串
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- 最大子段和最大子段积java实现
- java实现最长公共子序列和最长公共子字符串
- 动态规划解决最长公共子序列和最长公共子字符串问题 java实现
- 最长公共子串--后缀数组实现
- 求最大子数组/子序列/子段和问题
- 数组的最大子段和
- N03数组的最大子段和
- DP-循环数组最大子段和
- 循环数组的最大子段和
- 循环数组的最大子段和
- 1050 循环数组最大子段和
- 1050 循环数组最大子段和
- 进程间的通信:管道
- nyoj1189 yougth和他的朋友们(滚动数组运用)
- nsdate转nsstring
- 卸载Ubuntu下自带openjdk
- 加载模块报错:version magic '2.6.32-504.el6.i686 SMP mod_unload 686 ' should
- 数组最长子段和java实现
- Hadoop集群安装遇到的问题
- Test
- 第二个项目前预演,完成了,(第6200小时的时候)
- 浅谈volatile
- 如何关闭移动web页面缩放功能
- 自己动手实现一个C#中List
- 数据库调优教程(四)Explain性能分析命令
- 多线程误区:一定会提高效率