题目描述:
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费
数据范围:
0<=n<=10^5,0<=val<=10^4
要求:空间复杂度 O(1),时间复杂度 O(n)
(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,C/C++,Dcat-Admin框架领域博主)
测试用例
示例序号 | 输入 | 返回值 | 说明 |
1 | [8,9,2,5,4,7,1] | 5 | 在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;同时,你也不能在买入前卖出股票。 |
2 | [2,4,1] | 2 | |
3 | [3,2,1] | 0 | 不能获取到任何利润 |
解题思路
(一)抛开题目的场景,直视题目的内心
什么股票买卖,什么赚钱利润,题目翻译为程序员好懂的话,应该是:这里有一个数组,请从中找出最大差(要求只能后面的数减前面的数)
(二)确定解题思路
因为空间复杂度 O(1),所以不能建新的数组;因为时间复杂度 O(n),所以不能计算任意两个数的差值然后取最小。
这个时空限制,是希望我们想出一种办法,边遍历这个数组,边就得出解。
设一个变量mix_num,记录当前已知的最小数字,初始为数组的最左边数字;
设一个变量max_cha,记录当前的最大差值,初始为0。
(更多博文,欢迎来我的博客学习交流have_a_cat的博客_CSDN博客-PHP,C/C++,Dcat-Admin框架领域博主)
i | 数组prices | mix_num | max_cha | 说明 |
_ | [8,9,2,5,4,7,1] | 8 | 0 | 初始 mix_num=prices[0]=8; max_cha=0; |
0 | [8,9,2,5,4,7,1] | 8 | 0 | |
1 | [8,9,2,5,4,7,1] | 8 | 1 | 因为(prices[1]-mix_num) > max_cha,所以max_cha=(prices[1]-mix_num)=(9-8)=1 |
2 | [8,9,2,5,4,7,1] | 2 | 1 | 因为prices[2] < mix_num,所以mix_num=prices[2]=2 |
3 | [8,9,2,5,4,7,1] | 2 | 1 | |
4 | [8,9,2,5,4,7,1] | 2 | 2 | |
5 | [8,9,2,5,4,7,1] | 2 | 5 | |
6 | [8,9,2,5,4,7,1] | 1 | 5 | 最终得最大差值max_cha=5 |
代码
把解题思路转化成代码,就AC了
class Solution {
public:
/**
*
* @param prices int整型vector
* @return int整型
*/
int maxProfit(vector<int>& prices) {
// 相当于求最大差
int mix_num; /* 当前的最小数字 */
int max_cha; /* 当前的最大差值 */
int i;
int z;
max_cha = 0;
if(prices.size() > 0){
mix_num = prices[0];
for(i = 0; i < prices.size(); i++){
if(mix_num > prices[i]){
mix_num = prices[i];
}
z = prices[i] - mix_num;
if(z > max_cha){
max_cha = z;
}
}
}
return max_cha;
}
};
最近渐渐迷上了滑雪,听闻好玩儿的运动有“两蓝一白”,蓝是滑翔伞和潜水,白是滑雪,慢慢的都体验一下。
----2022年2月16日 星期三