连续子数组的最大和
代码
//定义一个名为"连续子数组的最大和"的公共类
public class 连续子数组的最大和 {
// 定义一个静态变量maxn,并赋值为100010
static int maxn=100010;
// 定义一个静态的整数数组dp,大小为maxn
static int[] dp=new int[maxn];
// 定义一个公共方法maxSubArray,它接受一个整数数组nums作为参数
public int maxSubArray(int[] nums) {
// 初始化maxValue为nums数组的第一个元素
int maxValue = nums[0];
// 初始化dp数组的第一个元素为nums数组的第一个元素
dp[0] = nums[0];
// 使用for循环遍历nums数组,从第二个元素开始(索引为1)
for(int i=1; i<nums.length; i++) {
// 将dp数组的当前位置初始化为nums数组的当前元素
dp[i] = nums[i];
// 如果dp数组的前一个位置的值大于0,则将dp数组的前一个位置的值加到当前位置
if(dp[i-1]>0) {
dp[i] += dp[i-1];
}
// 更新maxValue,如果dp数组的当前位置的值大于maxValue,则更新maxValue
maxValue = Math.max(maxValue, dp[i]);
}
// 返回maxValue,即最大子数组的和
return maxValue;
}
// 主方法,程序的入口点
public static void main(String[] args) {
// 创建一个"连续子数组的最大和"类的实例
连续子数组的最大和 solution = new 连续子数组的最大和();
// 定义并初始化一个测试用的整数数组nums
int[] nums= {-2,1,-3,4,-1,2,1,-5,4};
// 调用solution对象的maxSubArray方法,并将结果存储在result变量中
int result = solution.maxSubArray(nums);
// 打印result的值到控制台
System.out.println(result);
}
}
详解
-
变量定义:
maxn=100010
: 这是一个静态变量,用于定义数组dp
的大小。这个值可能是为了确保dp
数组足够大,以容纳可能的所有情况,但在此特定问题中,这个大小可能是过度的。通常,为了简化,你可以直接使用输入数组nums
的长度作为dp
的大小。dp[]
: 这是一个动态规划数组,用于存储从数组开始到当前位置的最大子数组和。
-
maxSubArray 方法:
- 这个方法接受一个整数数组
nums
作为输入,并返回最大子数组的和。 maxValue
是用来存储当前找到的最大子数组和。开始时,它被初始化为nums[0]
,因为第一个元素自身就是一个子数组。dp[0]
被初始化为nums[0]
,表示从数组开始到第一个元素的最大子数组和。- 使用一个循环遍历
nums
数组。在每一步中,都会更新dp[i]
的值:- 首先,
dp[i]
被初始化为nums[i]
,表示当前元素自身作为一个子数组的和。 - 然后,检查
dp[i-1]
(即从数组开始到前一个元素的最大子数组和)是否大于0。如果是,那么将dp[i-1]
加到dp[i]
上,表示将当前元素与前一个最大子数组结合起来可能会得到一个更大的子数组和。 - 使用
Math.max(maxValue, dp[i])
更新maxValue
,确保它始终存储最大的子数组和。
- 首先,
- 循环结束后,返回
maxValue
。
- 这个方法接受一个整数数组
-
main 方法:
- 这是一个标准的Java主方法,用于测试
maxSubArray
方法。 - 创建一个
连续子数组的最大和
类的实例solution
。 - 定义一个测试数组
nums
。 - 调用
solution
的maxSubArray
方法,并将结果存储在result
中。 - 打印
result
。
- 这是一个标准的Java主方法,用于测试
当你运行这个程序时,它会输出 6
,这是数组 {-2,1,-3,4,-1,2,1,-5,4}
中最大子数组的和(子数组为 {4,-1,2,1}
)。