1. 程式人生 > 其它 >最長不下降子序列(LIS)和最長公共子序列(LCS)演算法

最長不下降子序列(LIS)和最長公共子序列(LCS)演算法

一、佇列:常應用於按順序操作元素

  先進先出

  佇列的實現(可使用陣列和指向佇列頭部的索引實現)

class queue():
    def _init_(self):
        self._list = []

    def enqueue(self, item): #入隊
        self._list.append(item)

    def dequeue(self): #刪除
        if self._list:
            return(self._list.pop())
        else:
            return None
    
def is_empty(self): return self._list == [] def size(self): return len(self._list)

隨著入隊等操作越多,浪費許多空間,尤其對於有空間限制時,例:只能分配一個長度為5的列表(陣列)

  迴圈佇列:使用固定大小的陣列和兩個指標指示起始位置和結束位置

# 迴圈佇列(設計一個容量為k的迴圈佇列)
class circularqueue():
    def __init__(self,k):
        """
        :type k: int
        
""" self.queue = [0] * k # 定義實現儲存佇列長度為k的列表(佇列) self.count = 0 # 定義列表目前的元素數 self.headindex = 0 # 定義列表的頭部索引 self.capacity = k # 定義列表的容量大小 def enqueue(self, value): # 向迴圈佇列插入元素 if self.count == self.capacity: return False else: self.queue[(self.count
+self.headindex)%self.capacity] = value self.count +=1 def dequeue(self): # 向迴圈佇列刪除元素 if self.count == 0: return False else: self.headindex = (self.headindex+1)%self.capacity self.count -=1 def front(self): # 返回隊首元素 if self.count == 0: return -1 else: return self.queue[(self.headindex)] def rear(self): # 獲取隊尾元素 if self.count == 0: return -1 else: return self.queue[(self.headindex+self.count-1)%self.capacity] def isEmpty(self): #判斷隊是否為空 return self.count == 0 def isFull(self): #判斷隊是否滿隊 return self.count == self.capacity

二、棧: 常應用反轉,例:反轉連結串列

先進後出

import math

# 實現一個棧,以及返回棧中最小的元素 `
class stack():
    def __init__(self):
        self.stack = []
        self.min = [math.inf] #math.inf代表浮點正無窮大

    def push(self,item):
        self.stack.append(item)
        self.min.append(min(item, self.min[-1]))

    def pop(self):
        self.stack.pop()  # pop預設最後一個
        self.min.pop()

    def gettop(self):
        return self.stack[-1]

    def getmin(self):
        return self.min[-1]end(item)
        self.min.append(min(item, self.min[-1]))