-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMinimum Subarray.cpp
More file actions
47 lines (46 loc) · 1.46 KB
/
Minimum Subarray.cpp
File metadata and controls
47 lines (46 loc) · 1.46 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
class Solution {
public:
/**
* 1. Kadane's algorithm
* 2. prefix sum;
*/
int minSubArray1(vector<int> nums) {
int min_ending_here = 0, min_so_far = nums[0];
for(int i=0; i<nums.size(); i++) {
int num = min_ending_here + nums[i];
if(num > 0) {
min_ending_here = 0;
min_so_far = min(min_so_far, nums[i]);
} else {
min_ending_here = num;
min_so_far = min(min_so_far, min_ending_here);
}
/*下面这种写法并不行;因为num>0时,第二个式子不成立
min_ending_here = min(0, min_ending_here + nums[i]);
min_so_far = min(min_so_far,
min(min_ending_here, nums[i]) );
*/
}
return min_so_far;
}
// 错误:对于min_subarray,要用max_sum, 而不是min_sum
int minSubArray2(vector<int> nums) {
int sum = 0, max_sum = 0, res = nums[0];
for(int i=0; i<nums.size(); i++) {
sum += nums[i];
res = min(res, sum - max_sum);
max_sum = max(max_sum, sum);
}
return res;
}
int minSubArray(vector<int> nums) {
int n = nums.size();
vector<int> arr(n);
arr[0] = nums[0];
for(int i=1; i<n; i++)
arr[i] = nums[i] + min(0, arr[i-1]);
int res = INT_MAX;
for(auto i: arr) res = min(i, res);
return res;
}
};