LeetCode Top 100 Liked Questions 53. Maximum Subarray (Java版; Easy)
题目描述
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
/*
连续子数组的最大和
遍历数组: sum加上当前值后, 1)先判断max是否需要更新 2)再判断sum是否小于0, 小于0的话sum更新为0, 大于0的话sum不变,继续累积
*/classSolution{publicintmaxSubArray(int[] nums){int sum =0, max = Integer.MIN_VALUE;for(int i=0; i<nums.length; i++){//execute
sum += nums[i];
max = Math.max(max, sum);//updateif(sum<0)
sum=0;}return max;}}
题解; 先处理sum再处理arr[i]
对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字
每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果
时间复杂度:O(n)O(n)
classSolution{publicintmaxSubArray(int[] nums){int ans = nums[0];int sum =0;for(int num: nums){if(sum >0){
sum += num;}else{
sum = num;}
ans = Math.max(ans, sum);}return ans;}}
题解; 分治法(divide and conquer approach)
publicclassSolution{publicintmaxSubArray(int[] nums){int len = nums.length;if(len ==0){return0;}returnmaxSubArraySum(nums,0, len -1);}privateintmaxCrossingSum(int[] nums,int left,int mid,int right){// 一定会包含 nums[mid] 这个元素int sum =0;int leftSum = Integer.MIN_VALUE;// 左半边包含 nums[mid] 元素,最多可以到什么地方// 走到最边界,看看最值是什么// 计算以 mid 结尾的最大的子数组的和for(int i = mid; i >= left; i--){
sum += nums[i];if(sum > leftSum){
leftSum = sum;}}
sum =0;int rightSum = Integer.MIN_VALUE;// 右半边不包含 nums[mid] 元素,最多可以到什么地方// 计算以 mid+1 开始的最大的子数组的和for(int i = mid +1; i <= right; i++){
sum += nums[i];if(sum > rightSum){
rightSum = sum;}}return leftSum + rightSum;}privateintmaxSubArraySum(int[] nums,int left,int right){if(left == right){return nums[left];}int mid =(left + right)>>>1;returnmax3(maxSubArraySum(nums, left, mid),maxSubArraySum(nums, mid +1, right),maxCrossingSum(nums, left, mid, right));}privateintmax3(int num1,int num2,int num3){return Math.max(num1, Math.max(num2, num3));}}