题目:
给定一个数组 array[1, 4, -5, 9, 8, 3, -6],在这个数字中有多个子数组,子数组和最大的应该是:[9, 8, 3],输出20,再比如数组为[1, -2, 3, 10, -4, 7, 2, -5],和最大的子数组为[3, 10, -4, 7, 2],输出18。
1、暴力解法
求出这个数组的所有子数组,然后将所有子数组之和的值进行比较,得到最大的值。
代码如下:
public class Test {
public static void main(String[] args) {
//int[] arr = new int[]{1, 4, -5, 9, 8, 3, -6};
int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
int max = new subArrSum().Add(arr);
System.out.println(max);
}
}
class subArrSum{
private int max;
public int Add(int[] arr){
max =arr[0];
int len = arr.length;
int sum = arr[0];
for(int i= 0;i<len;i++){
sum = 0;
for(int j = i;j < len;j++){
sum += arr[j];
if(sum > max)
max = sum;
}
}
return max;
}
}
【注意】时间复杂度达到了O(n2)。
2、一般解法
对于数组array,从array[1]开始逐个进行相加,与最大值比较,并不停地更替最大值。
代码如下:
public class Test {
public static void main(String[] args) {
//int[] arr = new int[]{1, 4, -5, 9, 8, 3, -6};
//int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
int[] arr = new int[]{-1, 2, 5, -7, 8, -10};
int max = new subArrSum().Add(arr);
System.out.println(max);
}
}
class subArrSum{
private int max;
public int Add(int[] arr){
if(arr == null || arr.length == 0)
return 0;
int len = arr.length;
max =arr[0];
int sum = arr[0];
for(int i= 1;i<len;i++){
if(sum<0)
sum = 0;
sum += arr[i];
if(sum > max)
max = sum;
}
return max;
}
}
3、动态规划思想
思路分析
(1)状态方程 :
max( dp[ i ] ) = getMax( max( dp[ i -1 ] ) + arr[ i ] ,arr[ i ] )
(2)上面式子的意义是:我们从头开始遍历数组,遍历到数组元素 arr[ i ] 时,连续的最大的和 可能为 max( dp[ i -1 ] ) + arr[ i ] ,也可能为 arr[ i ] ,做比较即可得出哪个更大,取最大值。时间复杂度为 O(n)。
代码如下:
public class Test {
public static void main(String[] args) {
//int[] arr = new int[]{1, 4, -5, 9, 8, 3, -6};
//int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
int[] arr = new int[]{-1, 2, 5, -7, 8, -10};
int max = new subArrSum().Add(arr);
System.out.println(max);
}
}
class subArrSum{
private int max;
public int Add(int[] arr){
if(arr == null || arr.length == 0)
return 0;
int len = arr.length;
max = arr[0];
int sum = arr[0];
for(int i= 1;i<len;i++){
sum = getMax(sum+arr[i], arr[i]);
if(sum > max)
max = sum;
}
return max;
}
public int getMax(int a,int b){
return a>b?a:b;
}
}