LeetCode 문제 풀이 의 53. Maximum Subarray (연속 하위 배열 의 최대 와 문제)
제목 설명 과 난이도
nums 을 지정 하고 최대 와 연속 적 인 하위 배열 (하위 배열 은 최소 하나의 요 소 를 포함) 을 찾 아 최대 와 합 을 되 돌려 줍 니 다.예시:
  : [-2,1,-3,4,-1,2,1,-5,4],
  : 6
  :       [4,-1,2,1]     ,  6。
진급:
만약 당신 이 복잡 도가 O (n) 인 해법 을 실현 했다 면 더욱 정교 한 분 치 법 으로 구 해 를 시도 해 보 세 요.
사고 분석.
풀이 관건: 연속 서브 배열 의 문 제 는 일반적으로 우 리 는 현재 옮 겨 다 니 는 요소 로 끝 나 는 그 서브 배열 에 착안 하여 이렇게 분석 하면 문 제 를 간소화 할 수 있다.
참고 해답
참조 해답 1
public class Solution {
    //          nums ,               (           ),      。
    /**
     *     :
     * dp[i] :     nums[i]             
     * 
     *       :
     * dp[i] = max{num[i],dp[i-1] + num[i]}
     *
     * @param nums
     * @return
     */
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        int[] dp = new int[len];
        dp[0] = nums[0];
        for (int i = 1; i < len; i++) {
            dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
        }
        //      ,          
        int res = dp[0];
        for (int i = 1; i < len; i++) {
            res = Math.max(res,dp[i]);
        }
        return res;
    }
}참고 해답 2: 참고 해답 1 과 같 습 니 다. 옮 겨 다 니 는 과정 에서 가장 좋 은 해답 을 구 했 을 뿐 입 니 다.
public class Solution2 {
    /**
     *   Solution   ,       
     *      :O(n)
     *      :O(1)
     *
     * @param nums
     * @return
     */
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        int segmentSum = nums[0];
        int res = nums[0];
        for (int i = 1; i < len; i++) {
            segmentSum = Math.max(nums[i], segmentSum + nums[i]);
            res = Math.max(res, segmentSum);
        }
        return res;
    }
    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        Solution2 solution = new Solution2();
        int maxSubArray = solution.maxSubArray(nums);
        System.out.println(maxSubArray);
    }
}참고 해답 3: 분 치 사상 을 사용 하면 개인 적 으로 좀 번거롭다 고 생각 하지만 우 리 는 이 문 제 를 통 해 분 치 사상 을 이해 할 수 있다.
public class Solution3 {
    /**
     *           
     * https://www.geeksforgeeks.org/divide-and-conquer-maximum-sum-subarray/
     *
     * @param nums
     * @return
     */
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        return maxSubArraySum(nums, 0, len - 1);
    }
    /**
     *       nums[mid]     
     *
     * @param nums
     * @param l
     * @param m
     * @param r
     * @return
     */
    private int maxCrossingSum(int[] nums, int l, int m, int r) {
        int sum = 0;
        int leftSum = Integer.MIN_VALUE;
        //       nums[mid]   ,         
        //      ,       
        //     mid            
        for (int i = m; i >= l; i--) {
            sum += nums[i];
            if (sum > leftSum) {
                leftSum = sum;
            }
        }
        sum = 0;
        int rightSum = Integer.MIN_VALUE;
        //        nums[mid]   ,         
        //     mid+1            
        for (int i = m + 1; i <= r; i++) {
            sum += nums[i];
            if (sum > rightSum) {
                rightSum = sum;
            }
        }
        return leftSum + rightSum;
    }
    /**
     * @param nums
     * @param l
     * @param r
     * @return
     */
    private int maxSubArraySum(int[] nums, int l, int r) {
        if (l == r) {
            return nums[l];
        }
        int mid = l + (r - l) / 2;
        return max3(maxSubArraySum(nums, l, mid),
                maxSubArraySum(nums, mid + 1, r),
                maxCrossingSum(nums, l, mid, r));
    }
    private int max3(int num1, int num2, int num3) {
        return Math.max(num1, Math.max(num2, num3));
    }
}이 글 의 주 소 는?https://liweiwei1419.github.io/leetcode-solution/leetcode-0053-maximum-subarray 만약 제 문제 풀이 에 잘못 이 있 거나 더 좋 은 해법 이 있다 면 저 에 게 알려 주 십시오[email protected] 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.