121股票的最佳买入时机


title: LeetCode 121
date: 2019-08-15 15:43:20
tags:


参考学习了Leetcode标准答案

一.暴力法

思路:

计算所有的可能性,然后比较利润

c++代码

class Solution {
public:
    int maxProfit(vector& prices) {
        int maxprofit = 0;
        for (int i = 0; i < (int)prices.size() - 1; i++) {
            for (int j = i + 1; j < (int)prices.size(); j++) {
                int profit = prices[j] - prices[i];
                if (profit > maxprofit)
                    maxprofit = profit;
            }
        }
        return maxprofit;

    }
};


二.一次遍历法

思路

一次遍历,寻找到最低谷和最高谷,然后作差保存和后续结果比较

思考

这个问题有他的特殊性,股票[7 1 5 3 6 4]只能先买后卖即在1时买入无法在7时卖出,所以遍历实际上是浅含时间条件的。看完第二种方法,暴力法资源浪费发生在例如[7 1 5 3 6 4]中他算完1后算5时分别遍历了[5 3 6 4]和[3 6 4],相同的[3 6 4]在1时毫无疑问是比5要利润高的,这一部分产生了浪费。

c++代码

class Solution {
public:
    int maxProfit(vector& prices) {
        int minprice = (1 << 31) - 1;
        int maxprofit = 0;
        for (int i = 0;i < (int)prices.size() - 1;i++) {
            if (prices[i] < minprice) {
                minprice = prices[i];
            }
            else {
                if ((prices[i] - minprice) > maxprofit) {
                    maxprofit = prices[i] - minprice;
                }
            }
        }
        return maxprofit;
    }
};

思考:

这个方法只遍历一次,比起暴力法节约了大量资源。
当时很困惑的一点是假设数组是[7 2 99 1 5 3 6 4] 这个时候最后他只能取到最低谷为 1,所以没运行前我以为他会漏掉97的情况,然而实际上他在以2为最低谷时已经将最高谷99和22的差值保存在maxprofit中,取最低谷1的过程中它实际已经变成对[1 5 3 6 4]后续的操作而前面的可能性已经解决


低级错误和收获:

1.java数据长度用的prices.length C++里用的prices.size() 以防万一加上类型准换(int),太久不接触全忘了。
2.(1<<31)-1实际上是整数的最大值,因为1的bit表示是00000...1左移后变成1000...000减去1变成01111...111{计算机系统}

你可能感兴趣的:(121股票的最佳买入时机)