买卖股票的最佳时机Ⅱ,买卖股票的最佳时机

题目:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

注意你不能在买入股票前卖出股票。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

示例 1:

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

示例 2:

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

class Solution:
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        stack = []
        sub = 0
        for i in prices:
            if len(stack) == 0:
                stack.append(i)
                continue
            if stack[0] < i :
                if sub < i - stack[0]:
                    sub = i - stack[0]
            else:
                stack.pop()
                stack.append(i)
        return sub
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

必发365游戏官方网址, 

示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

class Solution:
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """

        tmp = 0
        i = 0
        while i < len(prices) - 1:
            if prices[i + 1] > prices[i]:
                tmp += prices[i + 1] - prices[i]
            i += 1
        return tmp
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。



题目分析:

简单题,不必赘述。
只强调笔者的思路要点:
首先需要一个标志记录当前股票的状态(下面代码中的flag,0代表空仓,1代表满仓)
其次需要记录买入价格和卖出价格(下面代码中的buy和sale)
最后卖出后算出所得利润(下面代码中的profit)
注意:防止一天交易两次(代码中的continue语句),最后一天要特殊处理。

解答代码:
Python:

 1 class Solution:
 2     def maxProfit(self, prices):
 3         """
 4         :type prices: List[int]
 5         :rtype: int
 6         """
 7         flag=0
 8         buy=0
 9         sale=0
10         profit=0
11         for i in range(0,len(prices)-1):
12             if flag==0 and prices[i]<prices[i+1]:
13                 buy=prices[i]
14                 flag=1
15                 continue
16             if flag==1 and prices[i]>prices[i+1]:
17                 sale=prices[i]
18                 flag=0
19                 profit=profit+(sale-buy)
20         if flag==1:
21             sale=prices[len(prices)-1]
22             profit=profit+(sale-buy)
23                 
24         return profit

 

C语言解答与Python解答代码大致相同,只是语法的区别,此处省略!

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website