class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.empty())
return 0;
int maxValue = nums[0];
for(int i =1;i<nums.size();i++){
nums[i]=max(nums[i-1]+nums[i],nums[i]);
if(nums[i]>maxValue)
maxValue = nums[i];
}
return maxValue;
}
};
这是一个最大连续子数组和的问题。有同学会问,这是怎么看出来的,因为在数组中求两点的差,而两点之差可以转换成求和问题。也许你还是一脸懵,这怎么想的到。如果你学过高等数学,对牛顿莱布尼茨公式有印象的话:
只不过,在我这里,F() 函数不是连续的,而是离散化的,aa 和 bb 表示数组的下标。但是这不影响我们得出正确的结论。
总结下:区间和可以转换成求差的问题,求差问题,也可以转换成区间和的问题。
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty())
return 0;
vector<int> profit(prices.size());
int maxvalue = 0;
profit[0]=0;
for(int i=1;i<prices.size();i++){
profit[i]=prices[i]-prices[i-1];
profit[i]=max(profit[i-1]+profit[i],profit[i]);
maxvalue = maxvalue>profit[i]?maxvalue:profit[i];
}
return maxvalue;
}
};