08: 算法面试题2

Posted xiaonq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了08: 算法面试题2相关的知识,希望对你有一定的参考价值。

1.1 python实现栈在 O(1) 时间内求 min

  1、题目说明

      1. python的栈是用list实现的,只要将list的append和pop封装到stack类中,即实现了压栈和退栈。

      2. 可以考虑利用两个栈来实现,一个栈保存所有数据,另一个保存对应状态下的最小值。

      3. 当新压栈的元素小于等于栈内最小的元素时,将新元素压入min_list,min_list栈顶元素即为所求。

      举例:依次压栈3,2,4,1:

        stack_list = [3, 2, 4, 1]

        min_list = [3, 2, 1]

技术图片
#! /usr/bin/env python
# -*- coding: utf-8 -*-

class stack(object):
    stack_list = []
    min_list = []
    min = None

    # 只有最小栈本身为空或者当前的值小于等于最小栈的栈顶时进行压栈
    def push(self, x):
        if not self.stack_list:  # 栈为空直接入栈,并将第一个值压入min_list
            self.min = x
            self.min_list.append(self.min)
            self.stack_list.append(x)
            return
        self.stack_list.append(x)
        if self.min >= x:  # 如果即将入栈元素小于当前最小元素,替换当前最小元素,并推入min_list
            self.min = x
            self.min_list.append(self.min)
        return

    # 弹出的数据等于最小栈顶的数据,最小栈的数据也要弹出
    def pop(self):
        pop_result = None
        if self.stack_list:
            pop_result = self.stack_list[-1]
            if self.stack_list.pop() == self.min:
                self.min_list.pop()
                if self.min_list:  # 取出 min_list 中最小元素作为新的最小元素
                    self.min = self.min_list[-1]
                else:
                    self.min = None
            return pop_result
        else:
            self.min = None
            return pop_result

    def print_stack(self):
        print(self.stack_list)
        return

    def get_min(self):
        return self.min

    
if __main__ == __name__:
    s = stack()
    s.push(3)
    s.push(2)
    s.push(4)
    s.push(1)
    print s.get_min() # 1
O(1)时间求栈min

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1111111111111111111111111111111

以上是关于08: 算法面试题2的主要内容,如果未能解决你的问题,请参考以下文章

《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(回溯算法,全排列问题)C++

程序员面试金典面试题 01.08. 零矩阵

程序员面试金典面试题 01.08. 零矩阵

算法面试题 08.07. 无重复字符串的排列组合(多语言实现)

算法面试题 08.07. 无重复字符串的排列组合(多语言实现)

前端面试题之手写promise