关于商品买卖最大收益的问题
2015-10-05 16:59
323 查看
给定【2,4,7,8,7,10,5】这样一个序列,对于一件商品我们可以选择【买】【卖】【放弃】三种操作。
但是必须按照【买】【卖】的顺序进行。
问题描述:
不限定买卖次数,如何获得最大收益,收益最大是多少;
只进行一次买卖,最大收益是多少;
只进行两次买卖,最大收益是多少;
问题一
对数组进行处理,令diff=nums[i]-nums[i-1];只要diff>0,便将其加到最终的结果即可;
2+3+1+3=9;即【2,8】【7,10】
代码如下:
问题二
根据nums[i]-nums[i-1]重新生成一个序列,只进行一次买卖相当于求新序列的最大连续子段和;
2+3+1+(-1)+3=8,即【2,10】
代码如下:
问题三
这里介绍一下我的思路:在问题二的基础上,添加一层循环,用来控制将序列分成两部分。然后分别对左右部分进行问题二的操作,将两部分的最大收益值相加作为整个序列的最大利益。
根据对区间的不同划分,求出最大的利益;
6+3=9;即【2,8】【7,10】
由于代码比较简单,这里不再详述。
但是必须按照【买】【卖】的顺序进行。
问题描述:
不限定买卖次数,如何获得最大收益,收益最大是多少;
只进行一次买卖,最大收益是多少;
只进行两次买卖,最大收益是多少;
问题一
对数组进行处理,令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】
由于代码比较简单,这里不再详述。
相关文章推荐
- 数据结构【线性表(二)链表】项目之多项式求和
- 第4周 项目3 - 单链表应用(3)
- 第6周项目2—建立链栈算法库
- boost之scoped_array的使用
- 【第4周 项目6 - 多项式求和】
- HDU 5497 Inversion(树状数组求逆序对)
- 第四周项目3-单链表的应用(2)
- 【栈项目1 - 建立顺序栈算法库 第六周】
- 第三周项目4—顺序表应用问题(1)
- [Python进阶-1]高阶函数:闭包/装饰器/functools/lambda/map/filter
- POJ 3267 The Cow Lexicon (简单DP)
- OpenCV 学习(像素操作 2)
- 第4周 项目4-建立双链表算法库
- OpenCV 学习(像素操作 2)
- 使用Xcode 时候程序莫名其妙Build不过去的可能原因
- LeetCode 068 Text Justification
- GCD的认识和使用
- sk_buff 里的len, data_len, skb_headlen
- cocos代码研究(6)有限时间动作类(FiniteTimeAction)学习笔记
- 二维数组的查找