【嘎】数组-买卖股票的最佳时机

我又来拉低通过率了。。。

 题目:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

  输入: [7,1,5,3,6,4]
  输出: 5
  解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
  注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:

  输入: [7,6,4,3,1]
  输出: 0
  解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

解答1: 暴力法

 1 class Solution {
 2     public int maxProfit(int[] prices) {
 3             if (prices == null || prices.length < 1) {
 4                 return 0;
 5             }
 6             HashMap hm = new HashMap();
 7             hm.put("i", 0);
 8             hm.put("j", 0);
 9             int difference = 0;
10             for (int i = 0;i < prices.length - 1; i++) {
11                 for (int j = i+1; j < prices.length; j++) {
12                     if (prices[j] > prices[i]) {
13                         int diff = prices[j] - prices[i];
14                         if (diff > difference) {
15                             difference = diff;
16                             hm.put("i", i);
17                             hm.put("j", j);
18                         }
19                     }
20                 }
21             }
22 //            return Integer.parseInt(hm.get("j")+ "") - Integer.parseInt(hm.get("i")+ "");
23             return prices[Integer.parseInt(hm.get("j")+ "")] - prices[Integer.parseInt(hm.get("i")+ "")];
24         }
25 }

一激动以为成功了就提交了,测试的时候也没注意,以为没报错就是对的了。

看完官方的第一个解答,我发现返回的只要是差值,这不就是我的diffenence嘛,emmm

改成下面这样之后,也没有很快:

class Solution {
    public int maxProfit(int[] prices) {
            if (prices == null || prices.length < 1) {
                return 0;
            }
            int difference = 0;
            for (int i = 0;i < prices.length - 1; i++) {
                for (int j = i+1; j < prices.length; j++) {
                    if (prices[j] > prices[i]) {
                        int diff = prices[j] - prices[i];
                        if (diff > difference) {
                            difference = diff;
                        }
                    }
                }
            }
            return difference;
        }
}

 

 

 

 

 解答2:一次遍历

利用找到最低点,自己没想到,一开始还在怀疑这种写法。。。

    public int maxProfit(int[] prices) {
            int minprice = Integer.MAX_VALUE; // 记录最小点
            int maxdiff = 0;
            for (int i = 0; i < prices.length; i++) {
                if (prices[i] < minprice) {
                    minprice = prices[i];
                } else {
                    maxdiff = prices[i] - minprice > maxdiff ? prices[i] - minprice:maxdiff ;
                }
            }
            return maxdiff;
        }

 

 官方:

public class Solution {
    public int maxProfit(int prices[]) {
        int minprice = Integer.MAX_VALUE;
        int maxprofit = 0;
        for (int i = 0; i < prices.length; i++) {
            if (prices[i] < minprice)
                minprice = prices[i];
            else if (prices[i] - minprice > maxprofit)
                maxprofit = prices[i] - minprice;
        }
        return maxprofit;
    }
}

 

 

posted @ 2020-03-09 09:50  仓鼠爱画方格子  阅读(204)  评论(0编辑  收藏  举报