[leetcode]股票题型123
122. Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).
分析:主要是寻找数组中的递减子数组,及递增子数组(或者可以认为是极值点),然后求和即可。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int size = prices.size();
if (size <= )
return ;
int index = ;
int profit = ;
while(index < size)
{
int buy,sell;
while(index+ < size && prices[index] > prices[index+]) index++;
buy = index;
while(index+ < size && prices[index]< prices[index+]) index++;
sell = index;
profit += prices[sell] - prices[buy];
index++;
}
return profit;
}
};
123. Best Time to Buy and Sell Stock III
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
动态规划,preprofit保存i之前交易获得的收益。postprofit保存i之后交易获得的收益。
只能进行两次交易,在第0-i天,我进行一次交易,在第i天后我进行一次交易。
- preprofit保存,从开始那天到第i天,如果我进行交易的最大值,从max{preprofit[i-1],price[i]-curmin}获得。
从前往后扫:因为我要获得arr[0,..i](i++)包含i的最大收益:
1.要找到0-i的最小值,curmin需要更新
2.最大收益即之前的preprofit和当前price-curmin作对比。
- postprofit保存,从第i天到最后一天,如果我进行交易的最大值,从max{postprofit[i-1],curmax-postprofit[i]}获得。
从后往前扫描:因为我要获得arr[i+1……n](i++)的最大收益
1.要找到i+1~n的最大值,如果不是从后往前扫,而是从前往后扫,curmax保存的是0-i的最大值。而我们要找的是i+1~n的最大值。
2.最大收益即之后postprofit和当前的curmax-price做对比。
整个算法是这样的:是把整个数组分两段Max( MaxProfitOn[0,i] + MaxProfitOn[i+1, n-1] ),分别找最大,看看他们的和在如何分的时候才能达到全局最大。
最后遍历preprofit和postprofit数组,max{preprofit[i]+postprofit[i]}既是最大的可能收益。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int size=prices.size();
if (size<)
return ;
int curmin=prices[],curmax=prices[size-];
vector<int> preProfit(size,);
vector<int> postProfit(size,);
for(int i=;i<size;i++){
curmin=min(curmin,prices[i]);
preProfit[i]=max(prices[i]-curmin,preProfit[i-]);
}
for (int j = size-;j>=; --j){
curmax=max(curmax,prices[j]);
postProfit[j]=max(postProfit[j+],curmax-prices[j]);
}
int retProfit=;
for(int m=;m<size;m++){
if(retProfit<(preProfit[m]+postProfit[m]))
retProfit=preProfit[m]+postProfit[m];
}
return retProfit;
}
};
[leetcode]股票题型123的更多相关文章
- [leetcode] 股票问题
参考文章: [1] 团灭 LeetCode 股票买卖问题 [2] Most consistent ways of dealing with the series of stock problems 其 ...
- leetcode 新题型----SQL,shell,system design
leetcode 主要是一个针对北美的coder人群找工作的代码练习网站,我在2015年初次接触这个网站的时候,总共只有200多道题目,是一个类似acm 的a题网站.这些年变化越来越大,主要是因为找工 ...
- leetcode股票问题方法收集 转载自微信公众号labuladong
一.穷举框架首先,还是一样的思路:如何穷举?这里的穷举思路和上篇文章递归的思想不太一样. 递归其实是符合我们思考的逻辑的,一步步推进,遇到无法解决的就丢给递归,一不小心就做出来了,可读性还很好.缺点就 ...
- LeetCode矩阵题型
以三角形遍历矩阵 ; i < matrix.size(); ++i) { ; j < matrix[i].size(); ++j) swap(matrix[i][j], matrix[j] ...
- leetcode 121 122 123 . Best Time to Buy and Sell Stock
121题目描述: 解题:记录浏览过的天中最低的价格,并不断更新可能的最大收益,只允许买卖一次的动态规划思想. class Solution { public: int maxProfit(vector ...
- leetcode 股票系列
五道股票题总结: 121 买卖股票的最佳时机 122 买卖股票的最佳时机 124 买卖股票的最佳时机4 309 最佳股票买卖含冷冻期 714 买卖股票的最佳时机含有手续费 121 买卖股票的最佳时机 ...
- 5分钟了解二叉树之LeetCode里的二叉树
有读者反馈,现在谁不是为了找工作才学的数据结构,确实很有道理,是我肤浅了.所以为了满足大家的需求,这里总结下LeetCode里的数据结构.对于我们这种职场老人来说,刷LeetCode会遇到个很尴尬的问 ...
- java程序员学习路线阶段总结20190903
算法:锻炼写代码的逻辑 刷题位置:leetcode 书籍:小灰漫画算法 leecode使用方法: 转载自http://blog.csdn.net/tostq 又到了一年毕业就业季了,三年前的校招季我逃 ...
- Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
Leetcode之动态规划(DP)专题-123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III) 股票问题: 121. 买卖股票的最佳时机 122 ...
随机推荐
- java基础阶段关于密码或账号字符数字的判断总结
将字符串转成字符数组 首字母判断 思路:应该如何获取首字母 arr[0]为数组第一个元素即是首字母 数字判断true为数字false为非数字 "0123456789".contai ...
- 第8章 传输层(7)_TCP连接管理
7. TCP连接管理 7.1 TCP的连接建立 (1)三次握手 ①三次握手过程 A.第1.2次握手,数据包的SYN均为1,表示用于同步.即第1次客户端发起请求,并将自己的连接参数(如接收窗口大小.MS ...
- javascript-回归原生基础
//添加事件监听兼容函数 function addHandler(target, eventType, handler){ if(target.addEventListener){//主流浏览器 ad ...
- Android之socket多线程(二)
使用ServerSocket创建服务器端: public static void main(String[] args) throws IOException { // TODO Auto-gener ...
- luogu Eat the Trees
/* 用和模板类似的方法就行 但是实际上弱化版不用考虑匹配情况限制更加宽松, 只需要保存每个位置有无插头即可, */ #include<cstdio> #include<algori ...
- ASCII、Unicode和UTF-8
转自廖雪峰的官方网站:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138 ...
- 修改之前某次commit日志和内容
如果需要撤销最近一次提交的代码 已经commit,没有submit状态:可以使用git reset --hard HEAD^ 比如之前已经提交了五个patch,但是需要修改第三个. 第一步: 将修改的 ...
- lufen登录注册
创建精写报错信息表用于记录错误信息(新的文件夹,创建新的py) #静写报错信息class BaseResponse(object): def __init__(self): self.code=100 ...
- EditText获取焦点
这三个属性必须同时设置: private EditText passwde = null; passwde.setFocusable(true); passwde.setFocusableInTouc ...
- a标签自执行点击事件
//html <a href='http://www.baidu.com' ><button id='sss'>百度</button></a> //原生 ...