最長不下降子序列(LIS)和最長公共子序列(LCS)演算法
阿新 • • 發佈:2021-07-26
一、佇列:常應用於按順序操作元素
先進先出
佇列的實現(可使用陣列和指向佇列頭部的索引實現)
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 Nonedef 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]))