数据结构算法2总结

KMP方法

str1 中是否有一个字符串(连续)或者子序列(可以不连续),等于
str2.字串(连续)和子数组(连续)。
把str1='abdsc', str2='bd'。

最长前缀和最长后缀:不包含0和-1.
在str1中,在在字符串中某一个字符的从1开始的k字符为前缀,s的2阶前缀为ab,后缀为ds。

mancher算法

从一个文件中找到最大回文字符串。

  1. 1211 加入特殊字符串,#1#2#1#1#按字符位置进行遍历,进行查看是否有最大回文。

  2. 回文半径:回文的最大边界
    回文中心:回文的中心

BFPRT算法

数组的中位数,

  1. 数组分组,每个组由5个数
  2. 每个组内进行排序
  3. 每个组中位数拿出来进行组合新的数组,下中文数
  4. 递归调用bfprt算法
  • 最大值减去最小值小于或等于num的子数组数量
    给定数据arr和整数num,共返回有多少个子数组满足如下情况:
    max(arr[i..j]) - min(arr[i..j]) <= num
    max(arr[i..j])表示子数组max(arr[i..j])中的最大值,min(arr[i..j])表示子数组arr[i..j]中的最小值。
    如果数组的长度为N,请实现解法

单调栈

所有树结构中,某一个数值k,n=左边>k,m=右边>k。一个栈中,栈底是大值,栈顶是小值。[5,4,3,6],把数组放入栈中,得到[5,4,3]当需要把6放入栈时,发现6>3,所以需要把[5,4,3]弹出,建立信息表,把6压栈。

1

通过单调栈构建大根堆,通过基本流程构建大根堆,就可以得到每个数据中的头部为最大值。

  • 求最大子矩阵的大小
    给定一个整形矩阵map,其中的值只有0和1两种,求其全时1的所有矩阵区域中,最大的矩阵区域为1的数量。

  • 从一个环形数组中找到可见山峰

  1. 0对
  2. 2对
  3. (2 x n)-3 对

通过单调栈,把大值放到底下,小值放在上面,如果遇到比小值大的值就开始弹出小值,对小值进行结算。

搜索二叉树

从头结点看,左节点 < 头部,右节点>头部,相等的节点压在一起。

设计一个getMin的栈

image.png
image.png
class MyStack2:
    def __init__(self,):
        self.stackData = [];
        self.stackMin = [];

    def push(self, newNum):
        if (len(self.stackMin)==0):
            self.stackMin.append(newNum)
        elif (newNum < self.getMin()):
            self.stackMin.append(newNum)
        else:
            self.stackMin.append(self.stackMin[-1])

        self.stackData.append(newNum)

    def pop(self):
        if (len(self.stackData) == 0):
            return None
        self.stackMin.pop()
        return self.stackData.pop()

    def getMin(self):
        if (len(self.stackMin)==0):
            return None
        return self.stackMin[-1]

stack = [1,2,3,3,5]
stack1 = MyStack2()

for i in stack:
    stack1.push(i)
    stack1.getMin()
    print(stack1.getMin())

两个栈组成的队列

image.png
class TwoStackQueue:
    def __init__(self):
        self.stackPush = []
        self.stackPop = []

    def add(self, pushInt):
        self.stackPush.append(pushInt)

    def poll(self):
        if len(self.stackPop) == 0 and len(self.stackPush) == 0:
            return None
        elif len(self.stackPop) == 0:
            while self.stackPush:
                self.stackPop.append(self.stackPush.pop())
        return self.stackPop.pop()

    def peek(self):
         if len(self.stackPop) == 0 and len(self.stackPush) == 0:
            return None
         elif len(self.stackPop) == 0:
            while self.stackPush:
                self.stackPop.append(self.stackPush.pop())

         return self.stackPop[len(self.stackPop)-1]


queue = [1,2,3,3]
queue1 = TwoStackQueue()

for i in queue:
    queue1.add(i)
    print(queue1.peek())
    print(queue1.poll())
    print(queue1.peek())

使用递归函数实现栈的逆序


def getAndRemoveLastElement(stack):
    result = stack.pop()
    if len(stack) == 0:
        return result
    else:
        last = getAndRemoveLastElement(stack)
        stack.append(result)
        return last


def reverse(stack):
    if len(stack) == 0:
        return None
    last = getAndRemoveLastElement(stack)
    reverse(stack)
    stack.append(last)
stack = [1,2,3,4]
#print(getAndRemoveLastElement(stack))

print(reverse(stack))
print(stack)

猫狗队列

class Pet:
    def __init__(self,type):
        self.type = type

    def getPettype(self):
        return self.type

class Dog(Pet):
    def __init__(self,):
        #Pet.__init__(self,'dog')
        super(Dog,self).__init__('dog')

class Cat(Pet):
    def __init__(self,):
        #Pet.__init__(self,'cat')
        super(Cat,self).__init__('cat')

class PetEnterQueue:
    def __init__(self, pet, count):
        self.pet = pet
        self.count = count

    def getPet(self):
        return self.pet

    def getCount(self):
        return self.count

    def getEnterPetType(self):
        return self.pet.getPettype()

class DogCatQueue:
    def __init__(self,):
        self.dogQ = []
        self.catQ = []
        self.count = 0

    def add(self, pet):
        if pet.getPettype() == 'dog':
            self.dogQ.append(PetEnterQueue(pet, self.count))
            self.count += 1

        elif pet.getPettype() == 'cat':
            self.catQ.append(PetEnterQueue(pet, self.count))
            self.count += 1
        else:
            return None

    def pollAll(self):
        if (not (len(self.dogQ) ==0)) and (not (len(self.catQ) == 0)):
            if (self.dogQ[len(self.dogQ)-1].getCount() < self.catQ[len(self.catQ)-1].getCount()):
                return self.dogQ.pop().getPet()
            else:
                return self.catQ.pop().getPet()

    def pollDog(self):
        if not(len(self.dogQ) == 0):
            return self.dogQ.pop().getPet()
        return None

    def pollCat(self):
        if not(len(self.catQ) == 0):
            return self.catQ.pop().getPet()
        return None

    def isEmpty(self):
        return (len(self.dogQ) ==0) and (len(self.catQ) == 0)

    def isDogQueueEmpty(self):
        return (len(self.dogQ) ==0)

    def isCatQueueEmpty(self):
        return (len(self.catQ) ==0)

queue = [Dog(),Dog(), Cat(), Dog(), Cat()]
queue1 = DogCatQueue()
for i in queue:
    queue1.add(i)
    print(queue1.isDogQueueEmpty())

用一个栈实现另一个栈的排序

image.png
image.png
def sortStackByStack(stack):
    help = []
    while not(len(stack) ==0):
        cur = stack.pop()
        while not (len(help) ==0) and (help[len(help) - 1] > cur):
            stack.append(help.pop())
        help.append(cur)

    while not(len(help)==0):
        stack.append(help.pop())
stack = [1,3,2,4,2]
sortStackByStack(stack)
print(stack)

生成窗口最大值数组

有一个整数数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次由滑一个位置。

image.png
image.png

使用res收集最大值。

import collections
def getMaxWindow(arr, w):
    if (not arr ) or (w < 1) or (len(arr) < w):
        return None

    qmax = collections.deque()
    res = [0] * (len(arr) - w + 1)
    index = 0
    for i in range(len(arr)):
        while (not (len(qmax) == 0)) and (arr[qmax[len(qmax) - 1]] <= arr[i]):
            qmax.pop()
        qmax.append(i)
        if qmax[0] == (i-w):
            qmax.popleft()
        if (i >= (w-1)):
            res[index] = arr[qmax[0]]
            index += 1
    return res

arr = [3,5,1,2,2,7,3,9]
print(getMaxWindow(arr, 3))

求最大子矩阵的大小

依次以每一层进行分割,进行每一层的数字叠加,每分割一次就进行一次计算。

image.png
def maxRecSize(map):
    if not (map) :
        return 0
    maxArea = 0
    height = [0] * len(map[0])
    for i in range(len(map)):
        for j in range(len(map[0])):
            height[j] = height[j] + 1
            if map[i][j] == 0:
                height[j] = 0
        maxArea = max(maxRecFromBottom(height), maxArea)
    return maxArea

def maxRecFromBottom(height):
    if not height:
        return 0
    stack = []
    maxArea = 0
    for i in range(len(height)):
        while stack and height[i] <= height[stack[len(stack) - 1]]:
            j = stack.pop()
            k = -1
            if stack:
                k = stack[len(stack)-1]
            curArea = (i - k -1) * height[j]
            maxArea = max(maxArea,curArea)
        stack.append(i)
    while stack:
        j = stack.pop()
        k = -1
        if stack:
                k = stack[len(stack)-1]
        curArea = (len(height) - k -1) * height[j]
        maxArea = max(maxArea,curArea)
    return maxArea

map = [[1,0,1,1],
       [1,1,1,1],
       [1,1,1,0]]

print(maxRecSize(map))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容