给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:文章来源:https://uudwc.com/A/0k1DP
输入:nums = [1] 输出:1
package TOP11_20;
/**
* 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
* <p>
* 子数组 是数组中的一个连续部分。
* <p>
* <p>
* <p>
* 示例 1:
* <p>
* 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
* 输出:6
* 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
* 示例 2:
* <p>
* 输入:nums = [1]
* 输出:1
* 示例 3:
* <p>
* 输入:nums = [5,4,-1,7,8]
* 输出:23
*/
public class Top12 {
// 思路一:求出数组中以其中每一个元素结尾的连续数组的最大值 组成一个新的数组,然后再在这个新的数组中找出最大值
public static int maxSubArray(int[] nums) {
int length = nums.length;
int[] dp = new int[length];
dp[0] = nums[0];
for (int i = 1; i < length; i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
}
}
int res = dp[0];
for (int i = 1; i < length; i++) {
res = Math.max(res, dp[i]);
}
return res;
}
// 优化一下
public static int maxSubArray2(int[] nums) {
int pre = 0;
int res = nums[0];
for(int num:nums){
pre = Math.max(pre+num,num);
res = Math.max(res,pre);
}
return res;
}
public static void main(String[] args) {
int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
System.out.println(maxSubArray(nums));
System.out.println(maxSubArray2(nums));
}
}
文章来源地址https://uudwc.com/A/0k1DP