给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
- package TOP11_20;
-
- /**
- * 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
- *
- * 子数组 是数组中的一个连续部分。
- *
- *
- *
- * 示例 1:
- *
- * 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
- * 输出:6
- * 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
- * 示例 2:
- *
- * 输入:nums = [1]
- * 输出:1
- * 示例 3:
- *
- * 输入: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));
- }
- }