`
huntfor
  • 浏览: 206297 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leetcode]Best Time to Buy and Sell Stock III

 
阅读更多

Best Time to Buy and Sell Stock III

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

Design an algorithm to find the maximum profit. You may complete at most two transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

 Best Time to Buy and Sell Stock 、Best Time to Buy and Sell StockII 这三道题是一脉相承的,当然这道题是最难的。DP与二分法的结合,实在是太妙了。不明白的可以戳这里

算法思想:

因为交易分为两次,因此以数组中的每个元素为临界,比如prices[i],计算出[ 0 ~ i ]区间的最大利润,再计算出[ i ~ n - 1]区间的最大利润,而每个区间的计算方法在 Best Time to Buy and Sell Stock 已经提过了,不再啰嗦。然后这样坐下来,时间复杂度为O(n * n)。

事实上:

 

载自pickless

 

对于点j+1,求price[0..j+1]的最大profit时,很多工作是重复的,在求price[0..j]的最大profit中已经做过了。
类似于Best Time to Buy and Sell Stock,可以在O(1)的时间从price[0..j]推出price[0..j+1]的最大profit。
但是如何从price[j..n-1]推出price[j+1..n-1]?反过来思考,我们可以用O(1)的时间由price[j+1..n-1]推出price[j..n-1]。
最终算法:
数组l[i]记录了price[0..i]的最大profit,
数组r[i]记录了price[i..n]的最大profit。
已知l[i],求l[i+1]是简单的,同样已知r[i],求r[i-1]也很容易。
最后,我们再用O(n)的时间找出最大的l[i]+r[i],即为题目所求。

 代码如下:

 public int maxProfit(int[] prices) {
        if(prices == null || prices.length < 2){
        	return 0;
        }
        int max = 0;//record the biggest profit
        int[] left = new int[prices.length];
        left[0] = 0;
        int leftBuyIn = prices[0];
        for(int i = 1; i < left.length; i++){
        	left[i] = Math.max(left[i - 1], prices[i] - leftBuyIn );
        	leftBuyIn =  Math.min(leftBuyIn, prices[i]);
        }
        int[] right = new int[prices.length];
        right[right.length - 1] = 0;
        int rightSellOut = prices[prices.length - 1];
        for(int i = prices.length - 2; i >= 0; i--){
        	right[i] = Math.max(right[i + 1], rightSellOut - prices[i]);
        	rightSellOut = Math.max(rightSellOut, prices[i]);
        }
        
        for(int i = 0 ; i < prices.length; i++){
       		max = Math.max(max, left[i] + right[i]);
        }
        
        return max;
    }

 

分享到:
评论

相关推荐

    java-leetcode题解之Best Time to Buy and Sell Stock III.java

    在深入探讨“java-leetcode题解之Best Time to Buy and Sell Stock III.java”这一文件内容之前,我们需要了解LeetCode平台及其题解的价值。LeetCode是一个专门面向技术面试的在线编程平台,它提供了一系列的编程...

    leetcode题目:Best Time to Buy and Sell Stock II

    《最佳买卖股票时机II》是LeetCode中的一道经典编程题目,主要涉及动态规划和数组操作的知识点。在这个问题中,我们被赋予一个整数数组`prices`,表示某支股票每天的价格。任务是找到在允许进行多次交易的情况下,...

    java-leetcode题解之Best Time to Buy and Sell Stock IV.java

    本篇Java题解关注的是“Best Time to Buy and Sell Stock IV”(买卖股票的最佳时机 IV),这是该系列问题中的一个变体,涉及动态规划这一算法思想。 首先,需要明确问题的具体要求。在这个变体中,给定一个数组,...

    java-leetcode题解之Best Time to Buy and Sell Stock with Cooldown

    在解决股票交易问题时,程序员们经常会遇到“Best Time to Buy and Sell Stock with Cooldown”这类问题。该问题属于动态规划的经典案例,通常被列为中等难度。在这类问题中,给定一个整数数组表示某只股票的价格,...

    java-leetcode题解之Best Time to Buy and Sell Stock II.java

    - 题目理解:Best Time to Buy and Sell Stock II这道题目的目的是寻找一个最佳的股票买卖时机,使得获得的利润最大化。 - 问题分析:此题是一道典型的动态规划问题,也可以使用贪心算法解决。 - 解题思路:贪心算法...

    java-leetcode题解之Best Time to Buy and Sell Stock I.java

    Best Time to Buy and Sell Stock I是LeetCode网站上的一道著名的编程题目,它属于动态规划的范畴。这道题目通常被称为“买卖股票的最佳时机”,主要是考察程序员对动态规划思想的理解和应用。在这个问题中,给定一...

    js-leetcode题解之123-best-time-to-buy-and-sell-stock-iii.js

    在JavaScript中,LeetCode题目"Best Time to Buy and Sell Stock III"是一个典型的数据结构和算法问题,通常出现在编程面试和算法训练中。该问题的目标是在给定的股票价格数组中找出最大的利润,但是与简单买卖一次...

    python-leetcode题解之123-Best-Time-to-Buy-and-Sell-Stock-III

    python python_leetcode题解之123_Best_Time_to_Buy_and_Sell_Stock_III

    lrucacheleetcode-LeetCode:CppSourceCode的LeetCode解决方案

    leetcode LeetCode 解决题目的总数: 136/1753 微信公众号: 工程师Ruojhen 算法-动态规划 题号 名称 English Name 题解 53 最大子序和 Maximum Subarray 70 爬楼梯 Climbing Stairs 121 买卖股票的最佳时机 Best Time...

    javalruleetcode-leetcode-java:力码笔记

    java lru leetcode leetcode-java leetcode刷题笔记 ...III 141.Linked List Cycle 142.Linked List Cycle II 188.Best Time to Buy and Sell Stock IV 217.Contains Duplicate 263.Ugly Number 264.Ugly Number II

    python-leetcode题解之122-Best-Time-to-Buy-and-Sell-Stock-II

    在探讨python实现leetcode第122题"Best Time to Buy and Sell Stock II"的解决方案前,我们首先需要明确题目要求。第122题属于动态规划和贪心算法范畴,要求编写一个程序,通过分析给定的股票价格数组来找出最大的...

    股票收益leetcode-leetcode:leetcode摘要

    股票收益leetcode LeetCode 股票问题 Best Time to Buy and Sell Stock (Easy) 一次交易,找最大收益 for i in prices: low = min(low, i) profit = max(profit, i-low) Best Time to Buy and Sell Stock II (Easy) ...

    python-leetcode题解121-Best-Time-to-Buy-and-Sell-Stock

    在探讨如何用Python解决LeetCode上的第121题“最佳买卖股票时机”之前,我们有必要对相关概念和解决策略进行充分了解。本题要求找到只进行一次买卖的最大利润,是动态规划算法中的典型问题。 首先,我们要明确题目...

    3、动态规划必练题(含解法).pdf

    - Best Time to Buy and Sell Stock III:存在多日限制交易,最多两次交易。 - Best Time to Buy and Sell Stock IV:与前三者不同,可能需要多次买入和卖出。 - Best Time to Buy and Sell Stock with Cooldown...

    js-leetcode题解之121-best-time-to-buy-and-sell-stock.js

    在JavaScript的世界里,LeetCode是一个广受欢迎的在线编程平台,它提供了一系列的算法题目,帮助程序员提升编程技能。其中“121. 买卖股票的最佳时机”是一个经典的动态规划问题,经常作为算法入门的练习题。本题...

    js-leetcode题解之122-best-time-to-buy-and-sell-stock-ii.js

    在JavaScript(简称JS)编程中,LeetCode题库提供了一系列的编程挑战,旨在帮助开发者提升算法和编程能力。本篇文档将深入分析LeetCode 122号题目,即“买卖股票的最佳时机 II”,并给出一种JS语言的解决方案。此...

    leetcode分类-LeetCode:力码

    leetcode 分类 LeetCode LeetCode Java Solution 2018年5月31日 更新 最近刷了一遍 LeetCode,发现第一次的代码确实有些 low 很多代码并不简洁,本来1行的代码可以写成3行 思维混乱 没有按照题目类型分类 没有写结题...

    Andy619-Zhu#CS-Notes-chu#63. 股票的最大利润1

    63. 股票的最大利润题目链接Leetcode:121. Best Time to Buy and Sell Stock题目描述可以有一次买入和一次卖出,买入必

    leetcode-常见考题4.pdf

    第一个问题是“Best Time to Buy and Sell Stock”(121题),题目要求找到一次买入和卖出股票的最好时机,使得收益最大化。解决这个问题的一种有效方法是使用线性扫描,遍历数组找到一个局部最小值作为买入点,再...

Global site tag (gtag.js) - Google Analytics