Leetcode算法学习日志-121 Best Time to Buy and Sell Stock

来源:互联网 发布:网络监控光纤收发器 编辑:程序博客网 时间:2024/05/01 21:56

Leetcode 121 Best Time to Buy and Sell Stock

题目原文

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

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.

Example 1:

Input: [7, 1, 5, 3, 6, 4]Output: 5max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)

Example 2:

Input: [7, 6, 4, 3, 1]Output: 0In this case, no transaction is done, i.e. max profit = 0.

题意分析

本题是一个简单的求最优解问题,只能买卖一次股票,求最大收益,当卖的时候的价格比买的时候高,收益为0。

解法分析

本题采用动态规划方法求解。如果用暴力方法,显而易见算法复杂度为O(n^2),所以一般用动态规划该方法复杂度变为o(n),只有一个for循环,也就是通过遍历一次原序列就能得到解。首先分析最优子结构,令从左开始的一个子序列中最小元素为a,下一个元素为b,如果b比a小,则算上b后的序列的最小元素就是b,否则仍是a;如果b比a大,则求其差值,与Pro比较,如果差值大于pro,则修改pro的值,否则pro的值不变。这是一个简单的自底向上的动态规划问题。C++代码如下:

class Solution {public:    int maxProfit(vector<int>& prices) {        int n=prices.size();        if(n==0||n==1)            return 0;        int pro=0,min=prices[0],i,temp;        for(i=1;i<=n-1;i++){            if(prices[i]>min){                temp=prices[i]-min;                if(temp>pro)                    pro=temp;            }            else                min=prices[i];        }        return pro;       }};
由于只有一个for循环,所以复杂度为O(n),注意对空输入和只有一个元素的输入的处理,都应输出0。



阅读全文
0 0
原创粉丝点击