[leetcode #53] Maximum Subarray


Problem


Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
A subarray is a contiguous part of an array.
Example 1:
Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Example 2:
Input: nums = [1]
Output: 1
Example 3:
Input: nums = [5,4,-1,7,8]
Output: 23
Constraints:
・ 1 <= nums.length <= 10⁵
・ -10⁴ <= nums[i] <= 10⁴
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.

Idea


これは最大のサブアレイを探して和を求める問題である.
O(n)を使用しないと、Times Limit Exceededが表示されます.Brute Forceで展開すると、配列をナビゲートしながら可能なすべてのサブアレイを比較します.
コードが短いがサブアレイの和が最大値であればよく考えるべきである.値currentSum、値maxSum.CurrentSumは、以前に求めた値と現在の値を比較することによってより大きな値を格納する変数です.maxSumは最初の値に初期化され、currentSumよりも常に大きな値が格納されます.
CurrentSumは現在のインデックス値を含む最大値の和であり、maxSumは配列全体の最大値の和である.インデックスを変更するたびに、以前に求めた最大値と、現在のインデックスを含むサブ配列の最大値を比較します.

Solution

class Solution {
    public int maxSubArray(int[] nums) {

        int currentSum = nums[0];
        int maxSum = nums[0];

        for(int i=1; i<nums.length; i++) {
            currentSum = Math.max(nums[i]+currentSum, nums[i]);
            maxSum = Math.max(currentSum, maxSum);
        }

        return maxSum;

    }
}

Reference


https://leetcode.com/problems/maximum-subarray/