zoukankan      html  css  js  c++  java
  • [LeetCode] 121. Best Time to Buy and Sell Stock Java

     题目:

     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.

     Example 1:

    Input: [7, 1, 5, 3, 6, 4]
    Output: 5
    
    max. 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: 0
    
    In this case, no transaction is done, i.e. max profit = 0.

    题意及分析:给出一个股票的价格序列,买入一次卖出一次,求能获得最大利润。其实就是求一个数组中,后面的数减去前面的数能得到的最大值。最容易想到的肯定是每次选一个数,遍历后面的数,求出直接的差然后和当前最大值进行比较,这样时间复杂度为O(n*n),
    但是最后会超时。对题目进行分析,发现可以用动态规划的方法求解。我们用一个数组res存储到某点能有的最大值,首先对于其中一个数prices[i](1<i<length):
    (1)如果当前的数大于前一个数,可以轻易得出到达该点可以得到的最大值res[i]为前一个数的最大值+(prices[i]-prices[i-1]),然后和当前最大值进行比较,大于当前最大值则重置最大值
    (2)如果当前数小于前一个数,又分为两种情况
      a.如果到前一个数的最大<=0,所以能到达当前点的最大差值res[i]为0
      b.如果到达前一个数最大差值大于0,则能到达当前点的最大差值res[i]为Math.max(res[i-1]+(prices[i]-prices[i-1]),0);
    对一个数单独处理最后遍历剩下的数即可得到答案。

    代码:
    public class Solution {
        public int maxProfit(int[] prices) {
            int length=prices.length;
            int[] res=new int[length];
            int max=0;
            if(length<=1)
            	return 0;
            res[0]=0;
            res[1]=0;
            for(int i=1;i<length;i++){
            	if(prices[i]>prices[i-1]){
            		res[i]=res[i-1]+(prices[i]-prices[i-1]);
            		if(max<res[i])
            			max=res[i];
            	}else{
            		if(res[i-1]<=0)
            			res[i]=0;
            		else{
            			res[i]=Math.max(res[i-1]+(prices[i]-prices[i-1]),0);
            		}
            	}
            }
            if(max>0) return max;
            else return 0;
        }
    }
    
    
    

      



  • 相关阅读:
    计算GPS点之间的距离
    C/C++ 获取系统时间 到秒 || 到毫秒
    Qt QLabel QTextBrowser 实现网址链接
    Qt QLabel 显示gif动图
    Qt QDateEdit QDateTimeEdit
    Qt QSpinBox 和 QDoubleSpinBox
    Qt QLineEdit 漂亮的搜索框 && 密码模式 && 格式化输入 && 提示文字 && 选择内容并移动 && 清除全部输入
    Qt QLabel 大小随内容自动变化 && 内容填充整个label空间
    Qt QComBox 文本框输入itemText && 文本框查找item && 本文框添加Item &&设置显示Item数量
    JSON.parse()和JSON.stringify()
  • 原文地址:https://www.cnblogs.com/271934Liao/p/6920644.html
Copyright © 2011-2022 走看看