-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathMaximum-Subarray.cpp
More file actions
137 lines (123 loc) · 3.08 KB
/
Maximum-Subarray.cpp
File metadata and controls
137 lines (123 loc) · 3.08 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Solution 1:
class Solution {
public:
int maxSubArray(vector<int> &nums){
//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
// 或者不用初始化为理论的最小值
//int res = INT_MIN;
int res = nums[0];
int n = nums.size();
for (int i=0;i<n;i++)
{
int sum = 0;
for (int j=i;j<n;j++)
{
sum+=nums[j];
res = max(res,sum);
}
}
return res;
}
};
// Solution 2:
class Solution {
public:
int maxSubArray(vector<int>& nums){
int res = nums[0];
int n = nums.size();
vector<int> dp(n);
dp[0] = nums[0];
for (int i=1;i<n;i++)
{
dp[i] = max(dp[i-1]+nums[i],nums[i]);
res = max(res,dp[i]);
}
return res;
}
};
class Solution {
public:
int maxSubArray(vector<int>& nums){
int res = nums[0];
int n = nums.size();
int sum = 0;
for (int i=0;i<n;i++)
{
if (sum>0)
{
sum+=nums[i];
}
else
{
sum = nums[i];
}
res = max(res,sum);
}
return res;
}
};
// Solution 3:
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
int res = nums[0];
int n = nums.size();
res = maxSubArrayHelper(nums, 0, n - 1);
return res;
}
int maxSubArrayHelper(vector<int> &nums, int left, int right)
{
if (left == right)
{
return nums[left];
}
int mid = (left + right) / 2;
int leftSum = maxSubArrayHelper(nums, left, mid);
//注意这里应是mid + 1,否则left + 1 = right时,会无线循环
int rightSum = maxSubArrayHelper(nums, mid + 1, right);
int midSum = findMaxCrossingSubarray(nums, left, mid, right);
int res = max(leftSum, rightSum);
res = max(res, midSum);
return res;
}
int findMaxCrossingSubarray(vector<int> &nums, int left, int mid, int right)
{
int leftSum = INT_MIN;
int sum = 0;
for (int i = mid; i >= left; i--)
{
sum += nums[i];
leftSum = max(leftSum, sum);
}
int rightSum = INT_MIN;
sum = 0;
//注意这里i = mid + 1,避免重复用到nums[i]
for (int i = mid + 1; i <= right; i++)
{
sum += nums[i];
rightSum = max(rightSum, sum);
}
return (leftSum + rightSum);
}
};
/// C++ Solution 4:
class Solution {
public:
int maxSubArray(vector<int> nums) {
int res = nums[0];
int n = nums.size();
int sum = 0;
for (int i=0;i<n;i++)
{
if (sum > 0)
sum+=nums[i];
else
sum = nums[i];
res = max(res,sum);
}
return res;
}
};