1、贪心算法
/** * https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/ * @param nums * @return */ public static int maxSubArray(int[] nums) { /* 思路: 动态规划,遍历数组,当前最大子序和为sum,结果为res 当sum>0 说明对结果有增益作用,则sum保留,并且sum+=nums[i] 当sum<=0 说明对结果没有增益作用,则舍弃,同时sum=num[i] 每次遍历比较sum、res,取最大值返回 */ int sum=0; int res=nums[0]; for (int i = 0; i < nums.length; i++) { if(sum>0){ sum+=nums[i]; }else{ sum = nums[i]; } res = Math.max(sum,res); } return res; } public static void main(String[] args) { int[] nums = new int[]{-2,1,-3,4,-1,2,1,-5,4}; System.out.println(_动态规划.maxSubArray(nums)); }
2、动态规划
/** * 采用动态规划 * 思路: * 定义一个数组int[] dp, dp[i] 表示i位置的最大子序列和 * dp[i] = max(num[i], dp[i-1]+num[i]) * 最后返回dp中的最大值 * @param nums * @return */ public static int maxSubArrayDP(int[] nums) { int[] dp = new int[nums.length]; dp[0] = nums[0]; int max = 0; for (int i = 1; i < nums.length; i++) { dp[i] = Math.max(nums[i], nums[i]+dp[i-1]); max = Math.max(max,dp[i]); } return max; }