剑指offer-JZ63 买卖股票的最好时机(一)(Java版)

描述

假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天

2.如果不能获取到任何利润,请返回0

3.假设买入卖出均无手续费

4要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

示例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

 第一种解法

直接暴力解决,把所有的情况都列举出来,找出最大利润即可,代码如下,很遗憾,由于此种解法,非常暴力,耗时较长,未能通过题目时长限制

public int firstMaxProfit (int[] prices) {
        int result = 0;
        if(prices == null || prices.length < 1){
            return result;
        }
        for (int i = 0; i < prices.length; i++) {
            for (int j = i+1; j < prices.length; j++) {
               int tmp =  prices[j] - prices[i];
               if(tmp > result){
                   result = tmp;
               }
            }
        }
        return result;
    }

第二种解法

使用贪心算法,我们在遍历过程中,记录最小的情况,并且记录利润情况,判断即可,这样只用循环一遍数组,便可以拿到结果,代码如下

public int secondMaxProfit (int[] prices) {
        int result = 0;
        if(prices == null || prices.length < 1){
            return result;
        }
        int min = prices[0];
        for (int price : prices) {
            min = Integer.min(min,price);
            result = Integer.max(result,price - min);
        }
        return result;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值