本文提供两种思路:
1、分析问题关系得出,最大利润便是向量中所有升序列的序列尾减去序列头然后相加,比如说{1,2,3},最大利润为3-1=2,等价为(3-2)+(2-1)=2,在数组中可以用后一位减去前一位,若值>0,说明这两个数是递增的,便可以在总利润中加上两者差值。代码实现如下,十分简洁:
该代码时间复杂度为O(N):
class Solution{
public:
int maxProfit(vector<int>& nums) {
int temp = 0 ,sum = 0;
for(int i=1; i<nums.size(); i++){
temp = nums[i]-nums[i-1];
if(temp>0)
sum += temp;
}
return sum;
}
};
这里提供另一种时间复杂度O(N)版本,双指针,通常用来优化算法运行时间,但是麻烦一点,需要特别注意边界条件、停止条件和指针逻辑,容易出错,最好先画出流程图。代码如下:
class Solution {
public:
int maxProfit(vector<int>& nums) {
int sum=0, p, q;
bool key_buy = true, key_sell = false;
int buy,sell;
for(int i=0; i<nums.size(); i++)
{
p = i;
q = p+1;
while(q<nums.size() && nums[p]<nums[q])
{
if(key_buy){
buy = nums[p];
key_buy = false;
key_sell = true;
continue;
}
sell = nums[q];
p++,q++;
}
if(key_sell){
sum += (sell - buy);
key_buy = true;
key_sell = false;
i = p;
}
}
return sum;
}
};