假设有个数组 arr = [ -4,-5,-10,7,4,-12 ] , 求出连续下标子数组的最大和.
1.笨方法,暴力遍历
遍历数组,挨个求出i元素为起始的最大连续数组
arr[i] + arr[i + 1]
arr[i] + arr[i + 1] + arr[i + 2]
arr[i] + arr[i + 1] + arr[i + 2] + arr[i + 3] + …
看代码
//常规遍历
func method1(arr []int)(int , int , int){
fmt.Println("method1>>>");
length := len(arr);
max := 0;
begin , end := 0 , 0;
step := 0;
for i := 0; i < length ; i ++ {
ret := 0;
for k := 0; k < length - i ; k ++ {
step ++;
ret += arr[i + k]; //挨个取出相加,找出最大值
if(ret > max){
max = ret;
begin = i;
end = i + k;
}
}
}
println("step:" , step);//运行了多少次
return begin , end , max;
}
时间复杂度为: n + (n - 1) + (n - 2) + … + (n - n)
2.动态规划算法
func method3(arr []int)(int , int , int){
cur := arr[0];
max := arr[0];
for k , v := range arr {
if(k == 0){
continue;
}
if(max < cur){
max = cur;
}
if(v > cur + v){
cur = v;
}else {
cur = cur + v;
}
}
if(max < cur){
max = cur;
}
return 0 , cur , max;
}