Skip to content

Latest commit

Β 

History

History
119 lines (94 loc) Β· 2.87 KB

File metadata and controls

119 lines (94 loc) Β· 2.87 KB

μ—°κ΄€ 링크

Problem

문제 μ„€λͺ…

아이디어

  • μ–΄λ–€ λ°©λ²•μœΌλ‘œ μ ‘κ·Όν–ˆλŠ”μ§€ μ„œμˆ 
  • 포슀 vs μ΅œμ ν™” 아이디어 차이 λ“±
  • μž‘λ„μ— λŒ€ν•œ κ³ λ €

βœ… μ½”λ“œ (Solution)

Brute force

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> partialSum(nums.size()+1, 0);
        int res = nums[0];
        for(int i=0;i<nums.size();i++){
            partialSum[i+1] = partialSum[i]+nums[i];
        }

        for(int i=0;i<partialSum.size();i++){
            for(int j=0;j<i;j++){
                res = max(res, partialSum[i]-partialSum[j]);
            }
        }

        return res;
    }
};
  • Brute Force
  • o(n^2) -> TLE

Kadane Algorithm - pass

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int currentSum = nums[0];
        int maxSum = nums[0];
        
        for (int i = 1; i < nums.size(); ++i) {
            currentSum = max(nums[i], currentSum + nums[i]);
            maxSum = max(maxSum, currentSum);
        }
        
        return maxSum;
    }
};
  • O(n)
  • λ‹€μŒ μ›μ†Œλ₯Ό μΆ”κ°€ν–ˆμ„ λ•Œ 더 μ’‹μ•„μ§€λ©΄ μ—°μž₯, μ•„λ‹ˆλ©΄ μƒˆλ‘œ μ‹œμž‘ν•˜λ©° 계속 κ°±μ‹ 

Divide and conquer - pass

class Solution {
public:
    int maxCrossingSum(vector<int>& nums, int left, int mid, int right) {
        int leftSum = INT_MIN, sum = 0;
        for (int i = mid; i >= left; i--) {
            sum += nums[i];
            leftSum = max(leftSum, sum);
        }

        int rightSum = INT_MIN;
        sum = 0;
        for (int i = mid + 1; i <= right; i++) {
            sum += nums[i];
            rightSum = max(rightSum, sum);
        }

        return leftSum + rightSum;
    }

    int maxSubArrayHelper(vector<int>& nums, int left, int right) {
        if (left == right)
            return nums[left];

        int mid = (left + right) / 2;

        int leftMax = maxSubArrayHelper(nums, left, mid);
        int rightMax = maxSubArrayHelper(nums, mid + 1, right);
        int crossMax = maxCrossingSum(nums, left, mid, right);

        return max({leftMax, rightMax, crossMax});
    }

    int maxSubArray(vector<int>& nums) {
        return maxSubArrayHelper(nums, 0, nums.size() - 1);
    }
};
  • O(n log n)
  • 참고용

μ΅œμ ν™” 포인트 (Optimality Discussion)

β€’ μ΅œμ ν™”ν•œ μ΄μœ μ™€ 원리 β€’ 더 쀄일 수 μžˆλŠ” μ—¬μ§€λŠ” μžˆλŠ”κ°€? β€’ κΈ°μ‘΄ 방법 λŒ€λΉ„ μ–Όλ§ˆλ‚˜ νš¨μœ¨μ μ΄μ—ˆλŠ”μ§€

πŸ§ͺ ν…ŒμŠ€νŠΈ & μ—£μ§€ μΌ€μ΄μŠ€

πŸ“š κ΄€λ ¨ 지식 볡슡

πŸ” 회κ³