【Leetcode122 -买股票的最佳时机 II Best Time to Buy and Sell Stock II】(C语言)
目录
买股票的最佳时机II
测试单元
题目分析
标准版
巧妙版(简称投机取巧版)
买股票的最佳时机II
给定一个数组,它的第i个元素是一支给定股票第i天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例1:
输入:[7,1,5,3,6,4]
输出:7
解释:在第2天(股票价格= 1)的时候买入,在第3天(股票价格= 5)的时候卖出,这笔交易所能获得利润= 5-1 = 4。
随后,在第4天(股票价格= 3)的时候买入,在第5天(股票价格= 6)的时候卖出,这笔交易所能获得利润= 6-3 = 3。
示例2:
输入:[1,2,3,4,5]
输出:4
解释:在第1天(股票价格= 1)的时候买入,在第5天(股票价格= 5)的时候卖出,这笔交易所能获得利润= 5-1 = 4。
注意你不能在第1天和第2天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例3:
输入:[7,6,4,3,1]
输出:0
解释:在这种情况下,没有交易完成,所以最大利润为0。
测试单元
首先我们先来写测试单元:由题目给出的例子可以写三个种测试单元(乱序股票,顺序股票,逆序股票)股票价格一直不变即可归为排序的股票(逆序,顺序) 。
#include <stdio.h>
#include <stdlib.h>
int main()
{int prices1[6] = { 7, 1, 5, 3, 6, 4 };int prices2[5] = { 1, 2, 3, 4, 5 };int prices3[5] = { 7, 6, 4, 3, 1 };int sum1 = maxProfit(prices1, 6);int sum2 = maxProfit(prices2, 5);int sum3 = maxProfit(prices3, 5);printf("%d%,%d,%d", sum1, sum2, sum3);system("pause");return 0;
}
题目分析
解决买股票问题而且要达到利润最大化,就需要讨论如何购买股票(购买股票的时机,出售股票的时机)由于我们知道全部股票的价格,并非像现实生活中的那样,我们只需要从一堆数据中用一个算法来选择购买的时机,出售得到时机即可达到利润最大化。(低价买入,高价出售)我们需要创建两个变量来存放股票一个交易阶段的购买日(最低价)出售日(最高价)直到股票的最后一日。
购买股票的时机:从第一天开始,向后确定一个相比与第一天股票价格低得日子作为购买日(或者第一天比第二天低就确定第一天为购买日)
出售股票得时机:从购买日向后确定一个相比购之日之后得那天股票价格高得日子作为出售日。
然后将第二次购买日从放到第一次出售日(交易日)的后一天开始遍历(按购买日的要求遍历)
再确定第二次出售日,以此类推,直到最后一个交易日截至。(必须确定购买日,交易日,然后再交易,增加利润)。
代码如下:
标准版
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int maxProfit(int* prices, int pricesSize)
{assert(prices);int min = 0, max = 0;int i = 0, j = 0;int sum = 0;while (i < pricesSize - 1)//到最后一个交易日截至{if (prices[i] < prices[i + 1])//确定购买日{min = i;for (j = i + 1; j < pricesSize; j++)//遍历{if (j == (pricesSize - 1) || prices[j] > prices[j + 1])//从而确定出售日{max = j;break;}}sum += (prices[max] - prices[min]);//利润i = j + 1;//第二次购买日的起始}elsei++;}return sum;
}
int main()
{int prices1[6] = { 7, 1, 5, 3, 6, 4 };int prices2[5] = { 1, 2, 3, 4, 5 };int prices3[5] = { 7, 6, 4, 3, 1 };int sum1 = maxProfit(prices1, 6);int sum2 = maxProfit(prices2, 5);int sum3 = maxProfit(prices3, 5);printf("%d%,%d,%d", sum1, sum2, sum3);system("pause");return 0;
}
巧妙版(简称投机取巧版)
要想获得利润最大化那就要抓住每次能获取利润的机会。打破题目中的要求(题目本应当是一天只能交易一次,但投机取巧,能获得最大股价就是利用好每一次涨跌的利润),你会发现,这种想法虽然不符合题目要求,但是可以得到相同的的答案。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int maxProfit(int* prices, int pricesSize)
{int i, max = 0; //定义买入初值跟,卖出最大值(股价)for (i = 1; i < pricesSize; i++){if (prices[i]>prices[i - 1]) //如果第一天股价大于第二天股价就卖出,题目本应当是一天只能交易一次,但投机取巧,能获得最大股价就是利用好每一次涨跌的利润。{max = max + prices[i] - prices[i - 1]; //利润叠加}}return max;
}
int main()
{int prices1[6] = { 7, 1, 5, 3, 6, 4 };int prices2[5] = { 1, 2, 3, 4, 5 };int prices3[5] = { 7, 6, 4, 3, 1 };int sum1 = maxProfit(prices1, 6);int sum2 = maxProfit(prices2, 5);int sum3 = maxProfit(prices3, 5);printf("%d%,%d,%d", sum1, sum2, sum3);system("pause");return 0;
}
【Leetcode122 -买股票的最佳时机 II Best Time to Buy and Sell Stock II】(C语言)相关推荐
- 【Leetcode】122. Best Time to Buy and Sell Stock II买卖股票的最佳时机 II
Best Time to Buy and Sell Stock II 买卖股票的最佳时机 II买卖股票的最佳时机 II Say you have an array for which the ith ...
- 【贪心 和 DP + 卖股票】LeetCode 122. Best Time to Buy and Sell Stock II
LeetCode 122. Best Time to Buy and Sell Stock II Solution1:我的答案 贪心和DP傻傻分不清! class Solution { public: ...
- [LeetCode]122. Best Time to Buy and Sell Stock II
[LeetCode]122. Best Time to Buy and Sell Stock II 题目描述 思路 I的后续 将数组分为几个小部分, 划分标准是 [i] < [i - 1](划分 ...
- 122 Best Time to Buy and Sell Stock II 买卖股票的最佳时机 II
假设有一个数组,它的第 i 个元素是一个给定的股票在第 i 天的价格. 设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再次购买前出售股票 ...
- C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4032 访问. 给定一个数组,它的第 i 个元素是一支给定股票第 ...
- Best Time to Buy and Sell Stock II
题目: Say you have an array for which the i th element is the price of a given stock on day i. Design ...
- 122. Best Time to Buy and Sell Stock II
一.题目 1.审题 2.分析 给出一个股票的每日价格的数组,可以多次交易,求最大利润是多大. 二.解答 1.思路: 方法一. 求最大利润,从后往前看,若以现在的价格卖出,前一天的价格买入的话,即可完成 ...
- LeetCode Best Time to Buy and Sell Stock II
原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ 题目: Say you have an array ...
- [LeetCode 123] - 买入与卖出股票的最佳时机III(Best Time to Buy and Sell Stock III)
问题 假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格. 设计一个算法找出最大的利润值.你最多只能进行两次交易. 注意: 你不能在同一时间进行多次交易(即你必须在再次买入股票之前卖出当前的 ...
最新文章
- C#语法糖(Csharp Syntactic sugar)大汇总
- pdf怎么转html?
- 【pyhon】怨灵侍全本漫画批量下载爬虫1.00
- 第四范式AI转型合伙人招聘进行时
- 【工业控制】How to Optimize a Waveform
- JMM 是如何解决 可见性有序性问题的
- 龙芯完成.NET移植稳步推进生态建设
- 3串锂电池电量检测ic bq2060pdf及应用原理图_接受电源IC需求挑战,轻松实现精确调节的电源电压!...
- python第三方zip_python第三方包的几种安装方式
- 【Unity】第5章 3D坐标系和天空盒
- python3安装与环境配置和pip的基本使用
- The engine “node“ is incompatible with this module
- android xml 工具下载,安卓xml文件编辑器
- 计算机单元格的引用计算,2017年职称计算机考试Excel教程:单元格引用
- 一键添加QQ群的方式(更新中。。。)
- UFS开发板代码分析
- 微信小程序开发中,图片报403问题(图片加载失败)解决办法
- 计算机专业四次评估,一直强才是真的强,四次评估结果看,哪些大学才是计算机专业强校...
- Python | 分析txt文档特定词汇的词频,以《天龙八部》为例
- 2018 ACM-ICPC 亚洲区域赛青岛站 E - Plants vs. Zombies(二分)