Skip to content

Commit aff0d63

Browse files
committed
Feat: 53. Maximum Subarray
1 parent 9a46c55 commit aff0d63

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

maximum-subarray/HC-kang.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/**
2+
* https://leetcode.com/problems/maximum-subarray
3+
* Kadane's Algorithm
4+
* T.C. O(n)
5+
* S.C. O(1)
6+
*/
7+
function maxSubArray(nums: number[]): number {
8+
let maxSum = nums[0];
9+
10+
for (let i = 1; i < nums.length; i++) {
11+
nums[i] = Math.max(nums[i], nums[i] + nums[i - 1]);
12+
maxSum = Math.max(maxSum, nums[i]);
13+
}
14+
15+
return maxSum;
16+
}
17+
18+
/**
19+
* Divide and Conquer version
20+
* T.C. O(n log n)
21+
* S.C. O(log n) - call stack
22+
*/
23+
function maxSubArray(nums: number[]): number {
24+
function maxSubArrayHelper(
25+
nums: number[],
26+
left: number,
27+
right: number
28+
): number {
29+
if (left === right) return nums[left];
30+
31+
const mid = (left + right) >> 1;
32+
const leftMax = maxSubArrayHelper(nums, left, mid);
33+
const rightMax = maxSubArrayHelper(nums, mid + 1, right);
34+
let leftSum = -Infinity;
35+
let rightSum = -Infinity;
36+
let sum = 0;
37+
38+
for (let i = mid; i >= left; i--) {
39+
sum += nums[i];
40+
leftSum = Math.max(leftSum, sum);
41+
}
42+
43+
sum = 0;
44+
for (let i = mid + 1; i <= right; i++) {
45+
sum += nums[i];
46+
rightSum = Math.max(rightSum, sum);
47+
}
48+
49+
return Math.max(leftMax, rightMax, leftSum + rightSum);
50+
}
51+
52+
return maxSubArrayHelper(nums, 0, nums.length - 1);
53+
}
54+
55+
/**
56+
* Iterative version
57+
* T.C. O(n log n)
58+
* S.C. O(log n) - call stack
59+
*/
60+
function maxSubArray(nums: number[]): number {
61+
const stack = [[0, nums.length - 1]];
62+
let maxSum = nums[0];
63+
64+
while (stack.length) {
65+
const [left, right] = stack.pop()!;
66+
if (left === right) {
67+
maxSum = Math.max(maxSum, nums[left]);
68+
continue;
69+
}
70+
71+
const mid = (left + right) >> 1;
72+
stack.push([left, mid], [mid + 1, right]);
73+
74+
let leftSum = -Infinity;
75+
let rightSum = -Infinity;
76+
let sum = 0;
77+
78+
for (let i = mid; i >= left; i--) {
79+
sum += nums[i];
80+
leftSum = Math.max(leftSum, sum);
81+
}
82+
83+
sum = 0;
84+
for (let i = mid + 1; i <= right; i++) {
85+
sum += nums[i];
86+
rightSum = Math.max(rightSum, sum);
87+
}
88+
89+
maxSum = Math.max(maxSum, leftSum + rightSum);
90+
}
91+
92+
return maxSum;
93+
}

0 commit comments

Comments
 (0)