leetcode练习、数据结构(121、买卖股票的最佳时机)

题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

思路一:暴力求解

通过阅读题目以及给出的例子,我们可以将这道题目看做是求解一个数组的单向最大值,那么我们可以使用两层for循环,在循环中对后一个数-前一个数的大小进行判断,将最大的数放在变量中,最后返回。 

思路二:只for循环一次

在一次for循环中经过每个元素时判断决定是否更新最大值或者将最小值更新,这样,只需要遍历一次就可以得到数组的单向最大值。

Java代码

package demo;

public class leetcode6 {
    //方法一:暴力求解
    public int maxProfit(int[] prices) {
        int maxpro=0;
        for(int i=0;i<prices.length;i++){//将数组中的任意两个元素对比,求单向最大值
            for(int j=i+1;j<prices.length;j++){
                if((prices[j]-prices[i])>maxpro){
                    maxpro=prices[j]-prices[i];
                }
            }
        }
        return maxpro;
    }
    //方法二:遍历一次即可

    public int maxProfit_other(int[] prices) {
        int maxpro=0;
        int minprice=Integer.MAX_VALUE;
        for(int i=0;i<prices.length;i++){//遍历一次即可
            if((prices[i]-minprice)>maxpro){//如果遇到需要更新最大利润的情况
                maxpro=prices[i]-minprice;
            }else{//elseif(minprice>prices[i])此为题目正解,我觉得不加限制条件也一样
                minprice=prices[i];
            }
        }
        return maxpro;
    }
}

class test6{
    public static void main(String arg[]){
        leetcode6 l=new leetcode6();
        int[] nums={7,1,5,3,6,4};
        System.out.println(l.maxProfit_other(nums));

    }
}

第二种算法并不是求最小值,然后找这个最小值后面的数和他比较

复杂度分析

思路一:

思路二:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值