给定【2,4,7,8,7,10,5】这样一个序列,对于一件商品我们可以选择【买】【卖】【放弃】三种操作。
但是必须按照【买】【卖】的顺序进行。
问题描述:
- 不限定买卖次数,如何获得最大收益,收益最大是多少;
- 只进行一次买卖,最大收益是多少;
- 只进行两次买卖,最大收益是多少;
问题一
对数组进行处理,令diff=nums[i]-nums[i-1];只要diff>0,便将其加到最终的结果即可;
2+3+1+3=9;即【2,8】【7,10】
代码如下:
int MaxSum(int *pNum, int len) { if(NULL == pNum) return 0; if(1 == len) return 0; int ret = 0; int diff = 0; for(int i = 1; i < len; ++i) { diff = pNum[i] - pNum[i - 1]; if(diff > 0) { ret += diff; } } return ret; }
问题二
根据nums[i]-nums[i-1]重新生成一个序列,只进行一次买卖相当于求新序列的最大连续子段和;
2+3+1+(-1)+3=8,即【2,10】
代码如下:
int getDis(int A[], int n) { // write code here int maxDis = 0; int dis = 0; for(int i = 1; i < n; ++i) { if(dis >= 0) { dis += A[i] - A[i - 1]; } else { dis = A[i] - A[i - 1]; } maxDis = max(maxDis, dis); } return maxDis; }
问题三
这里介绍一下我的思路:在问题二的基础上,添加一层循环,用来控制将序列分成两部分。然后分别对左右部分进行问题二的操作,将两部分的最大收益值相加作为整个序列的最大利益。
根据对区间的不同划分,求出最大的利益;
6+3=9;即【2,8】【7,10】
由于代码比较简单,这里不再详述。