买卖股票的最佳时机II--------(算法学习日记2021.5.20)

给定一个数组prices,prices[i]为一支股票第i天的价格,设计一个算法来计算能获取的最大收益,可以尽可能完成多的交易,但是不能同时参与多笔交易(必须在再次购买

 

 

第一次思考该问题 我认为需要先遍历数组,选出股调价格最低的一天,同时购入股票,然后再次遍历数组,选出在最低的一天之后最高的一天,并在这一天卖出股票,然后之后再在其余的天书中选取最小的一天,再在最高的一天卖出去,依次循环,直到最后一天跳出循环。

并第一时间写出了代码,代码如下

class Solution {
    public int maxProfit(int[] prices) {
        int day=0,money=0,sum=0;
        while(day!=prices.length-1){
            for(int j = day+1; j < prices.length; j++){   //遍历数组
                if(prices[j] < prices[day])  //找到数组中的最小值
                    day = j;
            }
             money = money -prices[day]; //记录购入的股票价格
            for(int j = day+1; j < prices.length; j++){   //遍历数组
               if(prices[j]>prices[day]){
                   day = j;
               }
                
            }money = money + prices[day];//卖出股票同时记录价格
        }
        if(money < 0) return 0 ;
        return money;
    }
}

第一次测试有以下几点错误:

1.最低的一天购入最高的一天卖出,其收益不一定为最大值。

2.算法耗费时间过长,导致超时。

3.结果并不正确

 

然后重新分析结果,上一次的代码中没有考虑可以多次出售股票,由于可以多次出售,可能最大值减去最小值并不能使利益最大化,在此我们加入可多次出售的因素,将数据画作坐标图,

通过坐标图,我们可以很直观的看出,若想获取最大利益只要把所有的上升部分加起来,因此出现了新的思路:只要后一天比前一天价格高就出售,然后依次加和,得出的结果必定为最大值。

代码如下:

class Solution {
    public int maxProfit(int[] prices) {
        int money = 0,t = 0;//t用于数组遍历 ans用于储存结果
        for(int i = 1;i < prices.length; i++){
            if(prices[i]>prices[i-1]){//如果在后一天卖掉能赚钱那就买掉
                t = prices[i]-prices[i-1];    
                money = money + t;
            }
        }
        return money;
    }
}

经查阅各位大佬的解法,此解法叫做贪心算法,将每一个问题分解成一个个小问题,在每一个小问题中求局部的最优解,最后加和可得出接近整体的最优解,但是只能用于求最大值或者最小值。

还有一种解法是动态规划,目前没有能力做出,在以后的笔记中会提及到。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值