zoukankan      html  css  js  c++  java
  • LeetCode——Best Time to Buy and Sell Stock I (股票买卖时机问题1)

    问题:

    Say you have an array for which the ith element is the price of a given stock on day i.

    If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

    大意是:有一个数组,数组的下标表示第几天,对应的值表示这一天的股票价格。如果只能买卖股票各一次(先买后卖),且每次交易量为一股,请设计一个算法求得最大收益。

    分析:

    首先理解题意,题目中的意思是初始手中是没有股票的,所以只能先买后卖,也就是说如果只有数组长度>=2,且a[1]>a[0]的时候才可能出现大于0的收益。

    理解了题意然后再考虑如果解决这个问题。

    在看完这道之后我的第一个想法是遍历一遍数组,找到其中的最小值、最大值,然后相减就是最终的结果,显然,,,不会有这么简单的题,,由于是先买才能卖,所以不一定是最大减最小,例如:[5,4,3,2,1],怎么都赚不了钱,怎么最大减最小。所以,继续思考。。

    其实仔细思考这个问题,可以发现这其实是一个动态规划问题。

    什么是动态规划问题?

    简单的来说,动态规划问题是指某个问题可以分成若干个阶段,而每个阶段都可以从若干个以前的阶段通过一个最优策略转移过来,而当前阶段的最优解就是从这些转移的过程中选出最好的那个,由于每一个前面考虑过的阶段的状态都是最优的,所以当前的阶段所处的状态也是最优的。

    带入到这道题中来,

    怎么分成若干个阶段?

    我们考虑第一阶段是在第1天买股票的最大收益,第二阶段是在第1天买股票的最大收益,以此类推。。。

    那么如何找到最优策略呢?

    第1天,最高价格(max)=最低价格(min)=a[0],所以最大收益profit=max-min=0;

    第2天,由于第一阶段的最大收益是0,所以这一阶段只需要考虑有了a[1]这个价格加入之后最大的收益是否大于0,否则最大收益还是0,由a[1]产生的最大的收益是a[1]-min,那么第二阶段的最大收益也就是a[1]-min和第一阶段的最优值相比的较大的值,

    以此类推,那么

    第n天,最大的收益就是max(a[n-1]-min,profit[n-2]),这里由于数组下标从0开始,所以第n天是a[n-1]。

    到此这道题解决完毕。

    代码如下(java):

    public class Solution {
        public int maxProfit(int[] prices) {
            if(prices == null || prices.length == 0)return 0;
            int profit = 0;
            int min = prices[0];
            for(int i=1; i<prices.length;i++){
               min = prices[i]<min?prices[i]:min;
               profit = prices[i]-min>profit?prices[i]-min:profit;
            }
            
            return profit;
        }
    }
  • 相关阅读:
    ROS知识(6)----基于Eclipse开发
    点旋转和坐标系旋转
    单目相机标定
    卡尔曼滤波(Kalman Filter)在目标边框预测中的应用
    稀疏编码直方图----一种超越HOG的轮廓特征
    Ubantu14.04下编译OpenCV3.0.0以及读取图片例子
    Linux知识(6)----VIM
    Linux知识(5)----LINUX下GDB调试
    抽象类与接口的区别
    java synchronized 用法
  • 原文地址:https://www.cnblogs.com/chrischennx/p/4014422.html
Copyright © 2011-2022 走看看