还是朋友给的。。。哈哈,原题如下:
求最大的连续子数组,用数学的话来说,就是求最大的连续子集合,其实我们可以把它看成是一个数学问题,然后就变成了求一个函数的最小值到最大值之间的区间(最小值在最大值的左边),而这个函数为y=sum(x),然后就可以了
代码如下:
package com.zsl.operation;
/**
*
* 类名称:MaxInterval
* 类描述:最大的子区间
* 创建人:张双亮
* 创建时间:2018年11月11日 下午5:03:09
* @version
*/
public class MaxInterval {
public static void main(String[] args){
int[] s = {1,-1,-12,22,33,23,-34,45,76,34,-34,56,-100};
int[] t = getResultInterval(s);
for(int i = 0; i < t.length; i++){
if(i == (t.length - 1)){
System.out.println(t[i]);
}else{
System.out.print(t[i]+",");
}
}
int[] index = getMinOrMaxIndex(t);
int[] p = getMaxInterval(s,index[0],index[1]);
for(int i = 0; i < p.length; i++){
if(i == (p.length - 1)){
System.out.println(p[i]);
}else{
System.out.print(p[i]+",");
}
}
}
/**
*
* 功能:计算数组中各阶段的总和
* 参数:@param params
* 参数:@return
* 作者:张双亮
* 日期:2018年11月11日 下午5:12:54
*/
private static int[] getResultInterval(int[] params){
int[] result = new int[params.length];
int sum = 0;
for(int i = 0; i < params.length; i++){
sum += params[i];
result[i] = sum;
}
return result;
}
/**
*
* 功能: 获取最大或者最小值索引
* 参数:@param params
* 参数:@param type
* 参数:@return
* 作者:张双亮
* 日期:2018年11月11日 下午5:20:50
*/
private static int[] getMinOrMaxIndex(int[] params){
int indexMax = 0;
int indexMin = 0;
int min = params[0];
int max = params[0];
for(int i = 1; i < params.length; i++){
if(params[i] > max){
max = params[i];
indexMax = i;
}
}
for(int i = 0; i < indexMax; i++){
if(params[i] < min){
min = params[i];
indexMin = i;
}
}
int[] index = {indexMin,indexMax};
return index;
}
/**
*
* 功能:根据索引获取相应的区间
* 参数:@param params
* 参数:@param indexStart
* 参数:@param indexEnd
* 参数:@return
* 作者:张双亮
* 日期:2018年11月11日 下午5:29:19
*/
private static int[] getMaxInterval(int[] params,int indexStart,int indexEnd){
int[] result = new int[(indexEnd - indexStart + 1)];
for(int i = indexStart; i <= indexEnd; i++){
result[i - indexStart] = params[i];
}
return result;
}
}
额 但愿能看懂吧。。。。。。。emmmmmmm