1、算法思想
2、训练
解法一:直接暴力,两层 for 循环不断的迭代进行求和,判断,更新最大值。
时间复杂度:O(n)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int tmp = 0, max = INT_MIN, len = nums.size();
for(int i = 0; i < len; i++) {
tmp = nums[i];
if(max < tmp) max = tmp;
for(int j = i + 1; j < len; j++) {
tmp += nums[j];
if(max < tmp) max = tmp;
}
}
return max;
}
};
解法二:利用 DP 数组来存储当前状态,如果上一子数组连续和小于 0, 则丢弃,加入当前值;否则,继续加和。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp = {nums[0]};
for(int i = 1; i < nums.size(); i++) {
if(dp.back() < 0)
dp.push_back(nums[i]);
else
dp.push_back(nums[i] + dp.back());
}
return *max_element(dp.begin(), dp.end());
}
};
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0) return 0;
int sum = nums[0], ans = nums[0];
for(int i = 1; i < nums.size(); i++) {
sum = (sum < 0) ? nums[i] : sum + nums[i];
ans = max(ans, sum);
}
return ans;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max = 0, tmp = 0, len = prices.size();
for(int i = 0; i < len - 1; i++) {
for(int j = i + 1; j < len; j++) {
tmp = prices[j] - prices[i];
max = (max > tmp) ? max : tmp;
}
}
return max;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int dp_ans = 0, dp_price = INT_MIN;
for(int i = 0; i < prices.size(); i++) {
dp_ans = max(dp_ans, dp_price + prices[i]);
dp_price = max(dp_price, -prices[i]);
}
return dp_ans;
}
};