-
Notifications
You must be signed in to change notification settings - Fork 64
/
Copy pathMaximumSubarray.cpp
110 lines (74 loc) · 1.75 KB
/
MaximumSubarray.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
Source: https://leetcode.com/problems/maximum-subarray/
2 Approaches
Approach 1 (Brute force, but will give TLE)
Time: O(n ^ 2), where n is the size of the given vector(nums)
Space: O(1), in-place
*/
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max = INT_MIN;
int size = nums.size();
for(int i = 0; i < size; ++i) {
int sum = 0;
for(int j = i; j < size; ++j) {
sum += nums[j];
if(sum > max) {
max = sum;
}
}
}
return max;
}
};
--------------------------------------------------------------------------------------------------
/*
Approach 2 (Kadane's algorithm)
Time: O(n), where n is the size of the given vector(nums)
Space: O(1), in-place
*/
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSoFar = nums[0];
int maxEnding = nums[0];
int size = nums.size();
for(int i = 1; i < size; ++i) {
int num = nums[i];
maxEnding += num;
if(num > maxEnding) {
maxEnding = num;
}
if(maxEnding > maxSoFar) {
maxSoFar = maxEnding;
}
}
return maxSoFar;
}
};
--------------------------------------------------------------------------------------------------
/*
Approach 3 (Slightly more optimzed than approach 2)
Time: O(n), where n is the size of the given vector(nums)
Space: O(1), in-place
*/
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSoFar = nums[0];
int maxEnd = nums[0];
int size = nums.size();
for(int i = 1; i < size; ++i) {
if(maxEnd < 0) {
maxEnd = nums[i];
} else {
maxEnd += nums[i];
}
if(maxEnd > maxSoFar) {
maxSoFar = maxEnd;
}
}
return maxSoFar;
}
};