力扣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)。
贪心算法
在听视频题解的时候,每次听到老师说动态规划,都会提到另外一个词——贪心算法。
那么什么是贪心算法?(摘录自知乎)
贪心算法,又名贪婪法,是寻找最优解的常用方法,这种方法模式一般将求解过程分为若干个步骤,每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以次希望最后堆叠出的结果也是最好/最优的解。{看着这个名字,贪心,贪婪这两字的内在含义最为关键。这就好像一个贪婪的人,他事事都想要眼前看到最好的那个,看不到长远的东西,也不为最终的结果和将来着想,贪图眼前局部的利益最大化,有点走一步看一步的感觉。}