[PS] Leet | 53. 최댓값을 가지는 하위 배열 - 덧셈

2025. 3. 19. 20:23·CS/PS

문제

Given an integer array nums, find the subarray with the largest sum, and return its sum.

예시

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 <= nums.length <= 105
  • -104 <= nums[i] <= 104

답

첫 번째 수부터 더했을 때 가장 작은 크기의 합이 되는 부분을 찾고, 그 부분에서 부터 총합이 제일 큰 지점을 찾습니다.

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let maxSum = nums[0];
    let sum = nums[0];

    for(let i=1; i<nums.length; i++) {
        if (0 < sum) {
            sum = sum + nums[i];
        } else {
            sum = nums[i];
        }

        if (sum > maxSum) {
            maxSum = sum;
        }
    }

    return maxSum;
};

시간복잡도 : O(n)

공간복잡도 : O(1)

 

분할 정복법으로도 구현 가능합니다.

 

이 때 subarray 별로 가장 큰 구간 구하는 법은, 중앙에서부터 좌/우로 가장 큰 합을 가지는 구간(leftMax, rightMax)을 구한 뒤, 둘을 붙여주는 것입니다.

function maxSubArray(nums) {
    function helper(left, right) {
        if (left === right) return nums[left];

        const mid = Math.floor((left + right) / 2);

        const leftSum = helper(left, mid);
        const rightSum = helper(mid + 1, right);
        const crossSum = maxCrossingSum(left, mid, right);

        return Math.max(leftSum, rightSum, crossSum);
    }

    function maxCrossingSum(left, mid, right) {
        let leftMax = -Infinity;
        let sum = 0;
        for (let i = mid; i >= left; i--) {
            sum += nums[i];
            leftMax = Math.max(leftMax, sum);
        }

        let rightMax = -Infinity;
        sum = 0;
        for (let i = mid + 1; i <= right; i++) {
            sum += nums[i];
            rightMax = Math.max(rightMax, sum);
        }

        return leftMax + rightMax;
    }

    return helper(0, nums.length - 1);
}

시간복잡도 : O(nlogn)

공간복잡도 : O(logn)

728x90

'CS > PS' 카테고리의 다른 글

[PS] 가장 가까운 두 수  (0) 2025.03.21
[PS] Leet | 33. 정렬된 회전 배열에서의 탐색  (0) 2025.03.20
[PS] Leet | 153. 정렬된 회전배열에서의 최소값  (0) 2025.03.20
[PS] Leet | 152. 최댓값을 가지는 하위 배열 - 곱셈  (0) 2025.03.20
[PS] Leet | 238. 자신을 제외한 곱  (0) 2025.03.18
'CS/PS' 카테고리의 다른 글
  • [PS] Leet | 33. 정렬된 회전 배열에서의 탐색
  • [PS] Leet | 153. 정렬된 회전배열에서의 최소값
  • [PS] Leet | 152. 최댓값을 가지는 하위 배열 - 곱셈
  • [PS] Leet | 238. 자신을 제외한 곱
Rayi
Rayi
  • Rayi
    아카이브
    Rayi
  • 전체
    오늘
    어제
    • 분류 전체보기 (262)
      • CS (40)
        • ML (3)
        • CV (2)
        • PS (34)
      • Reveiw (17)
        • Paper (17)
        • Github (0)
      • Pytorch (5)
      • Language (58)
        • Python (7)
        • JavaScript (32)
        • TypeScript (16)
        • C++ (3)
      • IDE (12)
      • Git (13)
      • Frontend (71)
        • React (8)
        • SolidJS (20)
        • CSS (12)
      • UI (3)
      • Backend (15)
        • DB (17)
        • Node.js (11)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Express
    C++
    CS
    python
    DB
    review
    vscode
    API
    CV
    deploy
    SOLID
    ps
    js
    nodejs
    ts
    frontend
    Three
    backend
    react
    PyTorch
    CSS
    Git
    postgresql
    PRISMA
    GAN
    figma
    UI
    mongo
    html
    ML
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Rayi
[PS] Leet | 53. 최댓값을 가지는 하위 배열 - 덧셈
상단으로

티스토리툴바