1. 程式人生 > >leet334遞增的三元子序列

leet334遞增的三元子序列

題目:


分析:

  1. 選取第一個元素為主元
  2. 遍歷陣列,當前元素大於主元,如果當前元素同時大於遞增序列棧頂元素,將當前元素壓入遞增序列棧,如果此時該元素大於前遞增序列棧棧頂,則返回真;如果當前元素小於遞增序列棧頂元素,清空當前遞增序列棧,如果彈出棧的棧頂元素小於前遞增序列棧棧頂元素,則替換前遞增序列棧
  3. 當前元素小於主元,替換主元,如果當前遞增序列棧長度為2,則新增至前遞增序列棧
  4. 該演算法時間複雜度為O(n),佔用記憶體為兩個常數尺寸的棧,空間複雜度為O(1)

程式碼:

class Solution(object):
    def increasingTriplet(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if len(nums) < 3:
            return False
        major = nums[0]
        stack = [major]
        stack2 = []
        for x in nums[1:]:
            if x > major:
                if stack2:
                    if x > stack2[-1]:
                        return True
                if x > stack[-1]:
                    stack.append(x)
                else:
                    if len(stack) == 2:
                        if stack2:
                            if x < stack2:
                                stack2 = stack[:]
                        else:
                            stack2 = stack[:]
                        stack = [major]
                        stack.append(x)
            elif x < major:
                major = x
                if len(stack) == 2:
                    if stack2:
                        if x < stack2:
                            stack2 = stack[:]
                    else:
                        stack2 = stack[:]
                stack = [x]
            # print stack
            if len(stack) >= 3:
                return True
        return False

思考: