zoukankan      html  css  js  c++  java
  • 股票买卖问题

    class Solution(object):
        def colorBorder(self, grid, r0, c0, color):
            """
            :type grid: List[List[int]]
            :type r0: int
            :type c0: int
            :type color: int
            :rtype: List[List[int]]
            """
            old_c = grid[r0][c0]
            if old_c==color:return grid
            m = len(grid)
            n = len(grid[0])
            dp=[[0]*n for i in range(m)]
            def is_b(x,y):
                
                if x<0 or y<0 or x>=m or y>=n:
                    return 1
                elif grid[x][y]!=old_c and dp[x][y]==0:
                    return 1
                return 0
            def dfs(x,y):
                
                if x<0 or y<0 or x>=m or y>=n:
                    return 
                elif grid[x][y]!=old_c:
                    return 
                elif dp[x][y]==1:
                    return 
                if is_b(x-1,y) or is_b(x+1,y) or is_b(x,y-1) or is_b(x,y+1):
                    grid[x][y] = color 
                
                dp[x][y] =1  
                dfs(x-1,y)
                dfs(x+1,y)
                dfs(x,y-1)
                dfs(x,y+1)
            dfs(r0,c0)
            return grid 
    

     

    股票利润:

    1、只做一次交易:

    class Solution(object):
        def maxProfit(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            if len(prices)==0:
                return 0
            min1 = prices[0]
            n = len(prices)
            for i in range(n):
                min1 = min(min1,prices[i])
                prices[i] = prices[i]-min1
            return max(prices)
    

    2、多次交易:

    122. 买卖股票的最佳时机 II

    class Solution(object):
        def maxProfit(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            min1 =10e4
            dp = 0
    
            for i in range(1,len(prices)):
                dp +=max(0,prices[i]-prices[i-1])
            return dp

    3、只做2次交易:

    class Solution(object):
        def maxProfit(self, prices):
            """
            :type prices: List[int]
            :rtype: int
            """
            
            n = len(prices)
            if n==0:return 0
            dp1=[0]*n
            dp2=[0]*n
            min1 = prices[0]
            for i in range(1,n):
                min1 =min(min1,prices[i])
                dp1[i] = prices[i]-min(min1,prices[i])
            max1 = prices[-1]
            for j in range(n-2,-1,-1):
                dp2[j] = max(max(prices[j],max1)-prices[j],dp2[j+1])
                max1 = max(prices[j],max1)
            max1 = dp1[-1]
            # print(dp1,dp2)
            for i in range(n-1):
                max1= max(max1,dp1[i]+dp2[i+1])
            return max1
     
    

    含手续费:

    714. 买卖股票的最佳时机含手续费

    class Solution(object):
        def maxProfit(self, prices, fee):
            """
            :type prices: List[int]
            :type fee: int
            :rtype: int
            """
    
            sell = 0
            buy = -5e6
            for i in range(len(prices)):
                buy = max(sell-prices[i],buy)
                sell = max(buy+prices[i]-fee,sell)
            return sell
    

    309. 最佳买卖股票时机含冷冻期

    需要一个sell 记录前两天完成交易的利润,sell1表示前一天的;

    class Solution(object):
        def maxProfit(self, prices):
            """
            :type prices: List[int]
            :type fee: int
            :rtype: int
            """
    
            sell = 0
            buy = -5e6
            if len(prices)<=1:return 0
            buy = max(sell-prices[0],buy)
            sell = max(buy+prices[0],sell)
            sell1 = max(buy+prices[1],sell)
            buy1 = max(-prices[1],buy)
           
            for i in range(2,len(prices)):
                tmp = sell1
                sell1 = max(buy1+prices[i],sell1)
                buy1 = max(sell-prices[i],buy1)
                sell  = tmp
                
            return sell1
    

    特例:k>数组的一半长度    md

    188. 买卖股票的最佳时机 IV

    class Solution(object):
        def maxProfit(self, k, prices):
            """
            :type k: int
            :type prices: List[int]
            :rtype: int
            """
    
            n = len(prices)
            if n<=1:return 0
            if k>=n:
                max1 = prices[0]
                d = 0
                for i in range(1,len(prices)):
                    if prices[i]>prices[i-1]:
                        d+=prices[i]-prices[i-1]
                return d
            dp=[[[0]*2 for j in range(k+1)] for i in range(n+1)]
            dp[0][0][1] = -prices[0]
    
            for i in range(n+1):#jiaoyi 1ci
                dp[i][0][0] = 0#max(dp[i-1][0][1]+prices[i],dp[i-1][0][0])
                dp[i][0][1] = -5e6#max(dp[i-1][0][0]-prices[i],dp[i-1][0][1])
            for j in range(k+1):
                dp[0][j][0] = 0
                dp[0][j][1] = -5e6
            
            for i in range(1,n+1):
                for j in range(1,k+1):    
                        dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j][1]+prices[i-1])
                        dp[i][j][1] = max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i-1])
    
            return dp[-1][k][0]
    

      

  • 相关阅读:
    某耳机厂商微信公众平台建设方案
    微信公众号订单好评红包返现系统
    LNMP的配置与优化
    微信公众号用户OpenID同步导出系统
    微信公众号无限定时群发系统
    小程序想要什么
    微信支付默认推荐关注规则
    微信小程序(应用号)资源汇总整理
    微信公众平台小程序开发教程
    微信应用号开发教程
  • 原文地址:https://www.cnblogs.com/SuckChen/p/13511331.html
Copyright © 2011-2022 走看看