leetcode Top100(12)最大子数组和

给你一个整数数组 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)); } }

你可能感兴趣的:(算法,leetcode,算法,数据结构)