c++
没看答案,暴力解法。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = nums[0];
int size = nums.size();
for(int i = 0; i < size; i++){
int temp = nums[i];
res = max(res, temp);
for(int j = i + 1; j < size; j++){
temp += nums[j];
res = max(res, temp);
}
}
return res;
}
};
动态规划
使用dp数组
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// state: dp[i]表示以nums[i]结尾的最大子数组和
// basecase: dp[0] = 0;
// transfer: dp[i] = max(dp[i-1] + nums[i], nums[i])
// result: max(dp)
int n = nums.size();
int res = INT_MIN;
vector<int> dp(n+1, 0);
for (int i = 1; i <= n; i++) {
dp[i] = max(dp[i-1] + nums[i-1], nums[i-1]);
res = max(res, dp[i]);
}
return res;
}
};
用一个变量代替dp数组
class Solution {
public:
int maxSubArray(vector<int>& nums) {
// state: dp[i]表示以nums[i]结尾的最大子数组和
// basecase: dp[0] = 0;
// transfer: dp[i] = max(dp[i-1] + nums[i], nums[i])
// result: max(dp)
// 可以dp[i]和dp[i-1]一起转移,用一个变量curr记录当前的最大值,然后更新res
int n = nums.size();
int res = INT_MIN;
int curr = 0;
for (int i = 1; i <= n; i++) {
curr = max(curr + nums[i-1], nums[i-1]);
res = max(res, curr);
}
return res;
}
};
python
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
dp = [0] * n
dp[0] = nums[0]
for i in range(1, n):
dp[i] = max(dp[i-1]+nums[i], nums[i])
return max(dp)