1 题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
2 解题思路
因为涉及到动态路径以及最优解的问题,因此首先想到使用动态规划来解答。那么本题的关键点就在于正确写出转移方程如下:
步骤:
- 建立一个和数字长度一致的dp表。
- 计算出数组中每个元素对应的dp值(当前元素结尾的子串的最大和)。
- 找出dp表中的最大值,即为本题所求的值。
3 代码实现
class Solution {
public static void main(String[] args){
System.out.println("请输入一个整数型数组,以空格隔开:");
Scanner sc = new Scanner(System.in);
//定义字符串数组
String[] nums = null;
//切分字符串,并将切分后的字符串保存在字符串数组中
nums = sc.nextLine().split(" ");
int[] num = new int[nums.length];
for(int i = 0; i < num.length; i++){
//String转Integer基本类型
num[i] = Integer.valueOf(nums[i]);
}
System.out.println(maxsubArray(num));
}
public int maxSubArray(int[] nums) {
//定义dp表,长度和数组相等
int[] dp = new int[nums.length];
dp[0]=nums[0];
//计算dp表
for(int j = 1;j<nums.length;j++){
if(dp[j-1]>0){
dp[j] = dp[j-1]+nums[j];//转移方程
}else{
dp[j] = nums[j];//转移方程
}
}
//求最大值
int max = Integer.MIN_VALUE;
for(int i = 0;i<dp.length;i++){
if(dp[i]>max)
max = dp[i];
}
return max;
}
}