package com.shiyeqiang.test1;
/**
* 题目3:(求数组中子序列和的最大值!!)
* 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
* 求所有子数组的和的最大值。
* 要求时间复杂度为O(n)。 例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
*
* @author Shiyeqiang
*
*/
public class Test3 {
public static void main(String[] args) {
int[] arr = new int[] { 1, -2, 3, 10, -4, 7, 2, -5 };
System.out.println(fun(arr));
}
/**
* 采取动态规划的思想求最大递增子序列的和 算法思想:①:首先判断数组是否有意义;
* ②:定义一个游标,将该游标与当前的最大值进行比较;
* 如果:游标大,则将最大值更新为游标的取值; 如果游标的值为为负数,则将游标的值为0;;
* ③:遍历完成以后,如果结果为为0,则说明最终结果应该是取得数组中的最大值!
*
*
*/
public static int fun(int[] arr) {
// 1:首先判断数组是否有意义
if (arr.length == 0 || arr == null) {
return 0;
}
//1, -2, 3, 10, -4, 7, 2, -5
int result = 0; //0
int temp = result; //0
for (int i = 0; i < arr.length; i++) {
temp += arr[i]; //1,-1,3,13,9,16,18,13
if (temp < 0) {
temp = 0; //0,则前面的将丢弃,因为是求得最大值的和的形式啊
}
if (temp > result) {
result = temp; //1,3,13,16,18
}
}
if (result == 0) {
//则这个时候将是取得字符串的最大值
result = arr[0];
for (int i = 0; i < arr.length; i++) {
if (result < arr[i]) {
result = arr[i];
}
}
}
return result;
}
}
子数组的最大和
最新推荐文章于 2023-04-02 17:14:46 发布