- λ¬Έμ λ§ν¬ : https://leetcode.com/problems/maximum-subarray/description/
- λ¬Έμ μ΄λ¦ : Maximum Subarray
- λ¬Έμ λ²νΈ : 53
- λμ΄λ : Medium
- μΉ΄ν κ³ λ¦¬ :
- μ΄λ€ λ°©λ²μΌλ‘ μ κ·Όνλμ§ μμ
- ν¬μ€ vs μ΅μ ν μμ΄λμ΄ μ°¨μ΄ λ±
- μ‘λμ λν κ³ λ €
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
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)
- λ€μ μμλ₯Ό μΆκ°νμ λ λ μ’μμ§λ©΄ μ°μ₯, μλλ©΄ μλ‘ μμνλ©° κ³μ κ°±μ
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)
- μ°Έκ³ μ©
β’ μ΅μ νν μ΄μ μ μ리 β’ λ μ€μΌ μ μλ μ¬μ§λ μλκ°? β’ κΈ°μ‘΄ λ°©λ² λλΉ μΌλ§λ ν¨μ¨μ μ΄μλμ§