- ๋ฌธ์ ๋งํฌ : 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)
- ์ฐธ๊ณ ์ฉ
โข ์ต์ ํํ ์ด์ ์ ์๋ฆฌ โข ๋ ์ค์ผ ์ ์๋ ์ฌ์ง๋ ์๋๊ฐ? โข ๊ธฐ์กด ๋ฐฉ๋ฒ ๋๋น ์ผ๋ง๋ ํจ์จ์ ์ด์๋์ง