这是一道很出名的算法题,我们一般第一个想到的思想应该就是,暴力循环查找比较方法,但是一般我想到的方法都可以改进时间复杂度跟空间复杂度,下面就是我的改良算法:
package test;
/**
* @author HRX
* @version 创建时间:2018年9月28日 下午8:30:26
* 类说明
*/
public class Test {
public static void main(String[] args) {
int[] num = {-9,-1,5,-3,7,-9,3,-1,-1,-2,4,2,2,2,-1,-5};
// int[] num = new int[6];
int sum = num[0]; //最大子集的和
int temp = 0; //临时数用于比较
//产生随机数组用于测试
// for(int i=0 ; i<num.length ;i+=2){
// num[i] = (int) (Math.random()*10);
// num[i+1] = (int) (-Math.random()*10);
// }
//查看数组有的
for(int x : num)
System.out.println(x);
for(int x : num){
if(temp <= 0){ //当前边自己之和小于等于0时,temp跳到当前位置,sum仍然记录最大值
temp = temp > 0? temp+x : x; //temp为负就舍去它,取后边的数
sum = sum>x ? sum : x;
}
else{
temp += x;
sum = temp > sum ? temp :sum;
}
System.out.println(temp+"-----------------"+sum); //测试temp跟sum的每一次过程
}
System.out.println("最大子集值:"+sum);
}
}