Leetcode: Best Time to Buy and Sell Stock IV

来源:互联网 发布:软件原型设计 编辑:程序博客网 时间:2024/05/22 16:45

Question

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 k transactions.

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

Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.

Show Tags
Show Similar Problems


Wrong Solution

class Solution(object):    def maxProfit(self, k, prices):        """        :type k: int        :type prices: List[int]        :rtype: int        """        if k<=0 or prices==[]:            return 0        globalv = [[0]*(k+1) for ind in range(len(prices))]                localv = [[0]*(k+1) for ind in range(len(prices))]        for i in range(len(prices)):            diff = prices[i] - prices[i-1]            for j in range(1,k+1):                localv[i][j]  = max( globalv[i-1][j-1] + max(diff,0),  localv[i-1][j]+diff )                globalv[i][j] = max( globalv[i-1][j], localv[i][j] )        return globalv[len(prices)-1][k]

Runtime Error since space complexity O(n*k)


My first try

class Solution(object):    def maxProfit(self, k, prices):        """        :type k: int        :type prices: List[int]        :rtype: int        """        if k<=0 or prices==[]:            return 0        if k>=len(prices):            return self.maxprofit2(prices)        globalv = [0]*(k+1)             localv = [0]*(k+1)        for i in range(1,len(prices)):            diff = prices[i] - prices[i-1]            for j in range(1,k+1):                localv[j]  = max( globalv[j-1] + max(diff,0),  localv[j]+diff )                globalv[j] = max( globalv[j], localv[j] )        return globalv[k]    def maxprofit2(self,prices):        maxv = 0        for ind in range(1,len(prices)):            if prices[ind]>prices[ind-1]:                maxv += prices[ind]-prices[ind-1]        return maxv

Solution 1

time complexity: O(n*k)
space complexity: O(k)

Get idea from here1, here2, here3, here4

class Solution(object):    def maxProfit(self, k, prices):        """        :type k: int        :type prices: List[int]        :rtype: int        """        if k<=0 or prices==[]:            return 0        if k>=len(prices):            return self.maxprofit2(prices)        globalv = [0]*(k+1)             localv = [0]*(k+1)        for i in range(1,len(prices)):            diff = prices[i] - prices[i-1]            for j in range(k,0,-1):                localv[j]  = max( globalv[j-1] + max(diff,0),  localv[j]+diff )                globalv[j] = max( globalv[j], localv[j] )        return globalv[k]    def maxprofit2(self,prices):        maxv = 0        for ind in range(1,len(prices)):            if prices[ind]>prices[ind-1]:                maxv += prices[ind]-prices[ind-1]        return maxv

Solution 2

Get idea from here

0 0
原创粉丝点击