[LeetCode] Best Time to Buy and Sell Stock 合集
2015-07-16 10:03
393 查看
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
给出股票每一天的价格,求解只做一次交易的最佳收益方案。
思路是首先建立一个存储股票每天差价的数组 diff[],其中 diff[i] = prices[i] - prices[i - 1],这样原问题就变成了最大连续子数组和的问题。
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
此题很简单,因为可以做无限次交易,所以只要某一天的股票价格比前一天的大就可以计入总收益。
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/
此题要求最多做两次交易,我们设置一个变量 i,从 0 变到 pricesSize,分别用第一题的办法检测 0 ~ i 和 i ~ pricesSize 的最大收益,并求和,因为差分数组比较大,所以先压缩一下,把连续的加和减序列分别合并。
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/
此题要求最多 k 次交易时的最优化方案,一直没有想明白,后来理解了网友提供的方法才写出。
给出股票每一天的价格,求解只做一次交易的最佳收益方案。
思路是首先建立一个存储股票每天差价的数组 diff[],其中 diff[i] = prices[i] - prices[i - 1],这样原问题就变成了最大连续子数组和的问题。
int maxProfit(int* prices, int pricesSize) { if (!pricesSize) return 0; int * diff = (int*)malloc(pricesSize * sizeof(int)); diff[0] = 0; for (int i = 1; i < pricesSize; ++i) { diff[i] = prices[i] - prices[i - 1]; } int max_val = 0; int curr_val = 0; for (int curr = 0; curr < pricesSize; ++curr) { curr_val += diff[curr]; if (curr_val > max_val) { max_val = curr_val; } else if (curr_val < 0) { curr_val = 0; } } free(diff); return max_val; }
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
此题很简单,因为可以做无限次交易,所以只要某一天的股票价格比前一天的大就可以计入总收益。
int maxProfit(int * prices, int pricesSize) { int ret = 0; for (int i = 1; i < pricesSize; ++i) { if (prices[i] > prices[i - 1]) ret += prices[i] - prices[i - 1]; } return ret; }
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/
此题要求最多做两次交易,我们设置一个变量 i,从 0 变到 pricesSize,分别用第一题的办法检测 0 ~ i 和 i ~ pricesSize 的最大收益,并求和,因为差分数组比较大,所以先压缩一下,把连续的加和减序列分别合并。
int calc_max_sum(int *arr, int begin, int end) { int max_val = 0; int curr_val = 0; for (int curr = begin; curr < end; ++curr) { curr_val += arr[curr]; if (curr_val > max_val) { max_val = curr_val; } else if (curr_val < 0) { curr_val = 0; } } return max_val; } int shrink(int * diff, int size, int * compressed) { memset(compressed, 0, size * sizeof(int)); int count = 0; int index = 0; while (diff[++index] <= 0) ; while (index < size) { char move_count = 0; while (index < size && diff[index] >= 0) { compressed[count] += diff[index++]; move_count = 1; } if (move_count) { ++count; move_count = 0; } while (index < size && diff[index] <= 0) { compressed[count] += diff[index++]; move_count = 1; } if (move_count) { ++count; move_count = 0; } } return count; } int maxProfit(int* prices, int pricesSize) { int * diff = (int*)malloc(pricesSize * sizeof(int)); int * compressed = (int*)malloc(pricesSize * sizeof(int)); for (int i = 1; i < pricesSize; ++i) { diff[i] = prices[i] - prices[i - 1]; } int max_size = shrink(diff, pricesSize, compressed); //以i为分界,求0~i-1和i~n-1的最佳之和 int max_val = 0; for (int i = 0; i < max_size; ++i) { int curr_val = calc_max_sum(compressed, 0, i) + calc_max_sum(compressed, i, max_size); if (curr_val > max_val) { max_val = curr_val; } } free(compressed); free(diff); return max_val; }
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/
此题要求最多 k 次交易时的最优化方案,一直没有想明白,后来理解了网友提供的方法才写出。
/*reference http://m.blog.csdn.net/blog/elton_xiao/44676957 https://leetcode.com/discuss/18330/is-it-best-solution-with-o-n-o-1 */
int max(int x, int y) { return (x > y) ? x : y; } int special(int * prices, int pricesSize) { int ret = 0; for (int i = 1; i < pricesSize; ++i) { if (prices[i] > prices[i - 1]) ret += prices[i] - prices[i - 1]; } return ret; } int maxProfit(int k, int* prices, int pricesSize) { if (k >= pricesSize) return special(prices, pricesSize); int * sell = (int*)calloc(k + 1, sizeof(int)); int * buy = (int*)malloc(k * sizeof(int)); for (int i = 0; i < k; ++i) { buy[i] = INT_MIN; } for (int day = 0; day < pricesSize; ++day) { for (int i = 0; i < k; ++i) { sell[i] = max(sell[i], buy[i] + prices[day]); buy[i] = max(buy[i], sell[i + 1] - prices[day]); } } int ret = sell[0]; free(buy); free(sell); return ret; }
相关文章推荐
- dhroid - ioc高级(接口,对象注入)
- 【Struts2四】利用拦截器对登陆进行拦截的小案例
- Java,php,python,js 注释
- 天声人語 20150716
- 【Android小练手】安卓端实时获取HttpUrl数据
- ROS进阶学习手记 2 -- RViz工具的学习1
- 如果是结束 总是面带微笑前进
- jQuery.extend()的合并对象功能
- ocs 修改数据库ip 用户名 密码
- 构造函数(构造器)的调用顺序
- 在Mac OS的终端中运行Swift应用的方法
- 永远不要再犯的 5 个编程错误
- 浅尝Unity 3D的Asset Bundle知识(四)-----基础打牢篇
- error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib
- 工作以后......
- Mac下opencv的安装遇到的问题解决
- sturct stat 结构体中 st_mode 的含义
- Unity中开场动画设置(二)
- 新建Maven项目
- ZH奶酪:Python中zip函数的使用方法