8月2日,贪心-买卖股票的最佳时期

      大家好呀,今天我们看两道用贪心算法解的两道题,150道经典面试题中的买卖股票的最佳时期1和2。

1.买卖股票的最佳时期1

. - 力扣(LeetCode)

思路

对于这题,我们其实很容易想出暴力解,那就是从后往前找值,对于每一个值找出前面的值与他相差最大的数,也就是前面数据中最小的那个数。那么,这需要两个for循环来遍历数组,时间复杂度达到O(N^2),在力扣上会超时,因此,这个时候会用到贪心思想,想一想,我们第一次遍历数组,是不是每次增加1,那么第二个循环中数据也每次增加一个,因此,容易想到我们只需要把上一次数据中的最小值与新增的哪个数据比较大小,如果新增的数比原来小那么新的数据是最小值,否则还是原来的数据是最小值,通过这个思路可以把两个for循环优化成一个for循环,因此得到此题的解

代码实现

class Solution {
    public int maxProfit(int[] prices) {
        int min = prices[0];//用于找前面数据最小值
        int profits =0;//利润
        for (int i = 1; i < prices.length; i++) { 
                if(prices[i-1]<min){
                    min=prices[i-1];
                }//找前面最小值
                  int x=prices[i]-min;//计算利润
            if (x> profits) {
                    profits = x;
                } //比较得出最大利润
        }
        return profits;
    }
}

2.买卖股票的最佳时期2

. - 力扣(LeetCode)

思路

这题可以拆分成每天的盈利,对于每个可以盈利的日子都买入股票,然后累加,其实思路比第一题还简单,关键在于弄懂题意

代码实现

class Solution {
    public int maxProfit(int[] prices) {
        int profits = 0;
        for (int i = 1; i < prices.length; i++) {

            if (prices[i] <= prices[i - 1]) {
                continue;
            }不盈利的情况
            int x = prices[i] -prices[i-1];
            profits += x;
        }
        return profits;
    }
}

也可以采用双指针形式,当后一个元素大于前一个时则快指针走,遇到后一个元素小于等于前一个时计算差值,并让慢指针走到快指针处,这种做法更能体现贪心,速度也会更快一些

class Solution {
    public int maxProfit(int[] prices) {
        int p = 0;
        for (int i = 0; i < prices.length; i++) {
            int j = i;
            while (j + 1 < prices.length &&
                    prices[j] < prices[j + 1]) {
                j++;
            }
            p += prices[j] - prices[i];
            i = j;

        }
        return p;
    }
}

结尾

本期博客就到这里啦,这种练科三耽误了一些时间,好在是顺利过了,后面一定会补上之前的进度,谢谢大家。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值