力扣121:买卖股票的最佳时机

题目描述:

给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润,返回你可以从这笔交易中获取的最大利润,如果你不能获取任何利润,返回0。

解题思路:

思路一:暴力破解法

说来惭愧,我想这道题想了一个晚上,修修改改,终于用对了暴力破解法,结果在力扣上运行显示超时.......真的,学习算法之路,任重而道远啊!

暴力破解没啥可说的,上代码:

public static int maxProfit(int[] prices){
        //存储一次循环的最大利润
        int max = 0;
        //存储所有循环的最大利用
        int maxProfit = 0;

        for (int i = 0; i < prices.length - 1; i++) {
            for (int j = i+1; j < prices.length; j++) {
                int temp = prices[i] - prices[j];
                if (temp < 0){
                    max = Math.max(max,-temp);
                }
            }
            maxProfit = Math.max(maxProfit,max);
        }
        return max;
    }
}

 思路二:动态规划

我又来了,我听着歌来了...看来今晚思路很清晰啊,也可能是上回做题对本题有了充分的理解,总之,看别人的题解思路时,看到了动态规划这个字眼,想到之前也做过类似的题(好像是求最大子序和),就想看看自己能不能用相同的思路做出来,然后,就..做出来了。天啊,看来真的要读明白题,难的不是数据结构,而是将文字转换成逻辑的过程。

 

动态规划思路是这样的:找出前几天的最小值,用一个临时变量存储当前值与最小值的差,然后比较找出最大的那个差。

public class Solution {
    public int maxProfit(int[] prices) {
        //存储前面几天的最小值
        int min = prices[0];
        //存储当前与之前最小值的差值
        int temp = 0;
        //比较每次的差值,找到最大的那个,存储最大差值
        int max = 0;

        for(int i = 1;i <= prices.length-1;i++){
            min = Math.min(min,prices[i]);
            temp = prices[i] - min;
             max = Math.max(max,temp);
        }
        return max;
    }
}

这种方法很快就通过了,时间复杂度为O(n)。

贪心算法

在听视频题解的时候,每次听到老师说动态规划,都会提到另外一个词——贪心算法。

那么什么是贪心算法?(摘录自知乎)

贪心算法,又名贪婪法,是寻找最优解的常用方法,这种方法模式一般将求解过程分为若干个步骤,每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以次希望最后堆叠出的结果也是最好/最优的解。{看着这个名字,贪心,贪婪这两字的内在含义最为关键。这就好像一个贪婪的人,他事事都想要眼前看到最好的那个,看不到长远的东西,也不为最终的结果和将来着想,贪图眼前局部的利益最大化,有点走一步看一步的感觉。}

 

posted @ 2023-03-09 19:41  园友1912508  阅读(30)  评论(0)    收藏  举报