본문 바로가기
Java/리트코드

[리트코드][Java] 53. Maximum Subarray 하위배열의 최댓값!

by 2D3 2023. 1. 4.
728x90

 

 

문제 설명

주어진 정수 배열 nums에서 최대값인 하위배열을 찾고 그것을 반환하라.


예시

Example 1:

Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: The subarray [4,-1,2,1] has the largest sum 6.
Example 2:

Input: nums = [1]
Output: 1
Explanation: The subarray [1] has the largest sum 1.
Example 3:

Input: nums = [5,4,-1,7,8]
Output: 23
Explanation: The subarray [5,4,-1,7,8] has the largest sum 23.

 


문제 풀이

  1. 이진 최대공약수 알고리즘 (binary GCD algorithm) / 스테인 알고리즘(Stein's algorithm)
class Solution {
    public int maxSubArray(int[] nums) {
        
        int currentSubarray = nums[0];
        int maxSubarray = nums[0];

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

        return maxSubarray;

    }
}

2. DP (다이나믹 프로그래밍)

class  Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        
        int largest = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[i - 1] + nums[i]) {
                nums[i] = nums[i - 1] + nums[i];
            }
            if (nums[i] > largest) {
                largest = nums[i];
            }
        }
        
        return largest;
    }
}

개념

SubArray 하위배열
배열 내에서 연속적이고, 비어 있지 않은 요소의 시퀀스

Dynamic programming 동적 프로그래밍(DP)
하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용

DP의 사용 조건

1) Overlapping Subproblems(겹치는 부분 문제)
2) Optimal Substructure(최적 부분 구조)

구현하기

1) Bottom-Up (Tabulation 방식) - 반복문 사용
2) Top-Down (Memoization 방식) - 재귀 사용

메모이제이션(Memoization)
모든 작은 문제들에 대해 한번씩만 풀면서 정답을 어딘가에 저장해 둡니다. 이를 활용하여 보다 큰 문제를 풀어 나갈때 똑같은 작은 문제에 대해 앞서 저장한 메모의 결과값을 이용

length: 배열의 길이 / length(): 배열 문자열의 길이

728x90

댓글