-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path53-MaxSubArray.py
More file actions
103 lines (88 loc) · 2.56 KB
/
53-MaxSubArray.py
File metadata and controls
103 lines (88 loc) · 2.56 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
# Python3
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
dp = [[0]*n for _ in range(n)]
maxNum = - 100001
for i in range(n):
dp[i][i] = nums[i]
for i in range(n):
for j in range(i+1, n):
dp[i][j] = dp[i][j-1] + nums[j]
for i in range(n):
for j in range(i, n):
if dp[i][j] > maxNum:
maxNum = dp[i][j]
return maxNum
# 动态规划转移方程: f(i) = max {f(i-1) + nums[i], nums[i]}
# 时间复杂度O(n), 空间复杂度O(1)
# C++
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto &x: nums) {
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
# Python3
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
sum = 0
maxAns = nums[0]
for i in range(n):
# sum = max(sum + nums[i], nums[i])
sum += nums[i]
if sum < nums[i]:
sum = nums[i]
# maxAns = max(maxAns, sum)
if sum > maxAns:
maxAns = sum
return maxAns
# Java
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}
# 分治
# 对于一个区间 [l, r], 维护四个量:
# lSum 表示 [l, r] 内以 l 为左端点的最大子段和
# rSum 表示 [l, r] 内以 r 为右端点的最大子段和
# mSum 表示 [l, r] 内的最大子段和
# iSum 表示 [l, r] 的区间和
# C++ 线段树
class Solution {
public:
struct Status {
int lSum, rSum, mSum, iSum;
};
Status pushUp(Status l, Status r) {
int iSum = l.iSum + r.iSum;
int lSum = max(l.lSum, l.iSum + r.lSum);
int rSum = max(r.rSum, r.iSum + l.rSum);
int mSum = max(max(l.mSum, r.mSum), l.rSum + r.lSum);
return (Status) {lSum, rSum, mSum, iSum};
}
Status get(vector<int> &a, int l, int r) {
if (l == r) {
return (Status) {a[l], a[l], a[l], a[l]};
}
int m = (l + r) >> 1;
Status lSub = get(a, l, m);
Status rSub = get(a, m+1, r);
return pushUp(lSub, rSub);
}
int maxSubArray(vector<int>& nums) {
return get(nums, 0, nums.size()-1).mSum;
}
};