Problem: 53. 最大子数组和
文章目录
- 题目描述
- 思路及解法
- 复杂度
- Code
题目描述
思路及解法
思路1:滑动窗口
1.为求出最大连续的子数组和,我们逻辑上假设有一个窗口在原数组上滑动,
欲求出最大连续,则需要保证窗口中的所有元素和最起码大于0;
2.即当当前窗口中的元素值的和小于0时,直接将其窗口舍弃,并在当前位置重新开一个新的窗口;
3.在实际操作中我们可以直接利用一个值(sum)进行累加操作,并判断其正负性;同时再记录一个值maxSum用于求出最大的连续子数组和
思路2:动态规划
1.用一个数组dp记录以第 i i i个数结尾时的最大子数组和;
2.欲得出当前的最大子数组和,则需要比较*dp[i - 1] + nums[i]的值与nums[i]*的值谁更大;
3.即得出动态转移方程:dp[i] = max(dp[i - 1] + nums[i], nums[i])
4.求出dp数组中的最大值即可
复杂度
思路1:滑动窗口
时间复杂度:
O ( n ) O(n) O(n);其中 n n n为原数组 n u m s nums nums的大小
空间复杂度:
O ( 1 ) O(1) O(1)
思路2:动态规划
时间复杂度:
O ( n ) O(n) O(n)
空间复杂度:
O ( n ) O(n) O(n)
Code
思路1:滑动窗口
class Solution {
public:
/**
* Slider windows
* @param nums Given array
* @return int
*/
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int maxSum = INT_MIN;
int sum = 0;
for (int i = 0; i < n; ++i) {
if (sum < 0) {
sum = 0;
}
sum += nums[i];
if (sum > maxSum) {
maxSum = sum;
}
}
return maxSum;
}
};
思路2:动态规划
class Solution {
public:
/**
* Dynamic programing
* @param nums Given arr
* @return int
*/
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n + 1);
dp[0] = nums[0];
for (int i = 1; i < n; ++i) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
}
int max = INT_MIN;
for (int i = 0; i < n; ++i) {
if (dp[i] > max) {
max = dp[i];
}
}
return max;
}
};