买卖股票的最好时机(贪心算法)-字节跳动/腾讯笔试编程C/C++

本文介绍了一个利用动态规划解决股票交易问题的算法,要求在只能买入和卖出股票一次的情况下找到最大收益。通过维护当前已知的最低价格和最大收益,遍历数组并更新这两个值,最终得到最大差值作为最大收益。代码实现简洁,时间复杂度为O(n),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

题目描述:

假设你有一个数组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日 星期三

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值