题目:
给定一个数组 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));
}
}
第二种算法并不是求最小值,然后找这个最小值后面的数和他比较
复杂度分析
思路一:
思路二: