o(1)复杂度找出栈中最小的元素

[算法]求最小元素 如何用O(1)的时间复杂度最小元素解题思路: 我们经常会采用空间换取时间提高时间复杂度。我们可以使用两个结构,一个用来存储数据,另一个用来存储中的最小元素。思路如下:如果当前入元素比原来中的最小值还小,则把这个值压入保存最小元素中;在出时,如果当前入元素恰好为当前中的最小值,保存最小值的元素也出,使得当前最小值变为其入之前的那个最小值。 实现代码如下:pa 阅读详情

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

思路

看到题先不管三七二十一暴力开解,最后以min函数不满足o(1)复杂度收场。

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []


    def push(self, x: int) -> None:
        # 入栈
        self.stack.append(x)

    def pop(self) -> None:
        self.stack.pop()

    def top(self) -> int:
        return self.stack[-1]

    def min(self) -> int:
        min_num = 0
        for i in self.stack:
            if i < min_num:
                min_num = i
        return min_num

在暴力解法中,min里用了个循环,直接导致时间复杂度飙升,如果想保持o(1)的时间复杂度,就得牺牲空间复杂度了,定义一个工具人栈2,只要能保持栈2的顶部元素一直是最小的那个,就能实现o(1)的min方法了。

实现

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack1 = []
        self.stack2 = []


    def push(self, x: int) -> None:
        # 入栈
        self.stack1.append(x)
        if not self.stack2 or self.stack2[-1] >= x:
            self.stack2.append(x)

    def pop(self) -> None:
        if self.stack1.pop() == self.stack2[-1]:
            self.stack2.pop()

    def top(self) -> int:
        return self.stack1[-1]

    def min(self) -> int:
        return self.stack2[-1]
别再为Vue跨域发愁了!手把手教你配置vue.config.js的devServer.proxy(附Nginx上线方案) 本文详细解析了Vue项目中的跨域问题,从本地开发环境的`vue.config.js`配置到生产环境的Nginx部署,提供了全链路解决方案。重点介绍了`devServer.proxy`的配置技巧和Nginx上线方案,帮助开发者彻底解决前后端联调中的跨域难题。 阅读详情

相关推荐

获得最小元素(时间复杂度1)优化

变量命名说明: mins  (min stack缩写)  data   (数据) 剑指offer经典解法  很朴素、直接:辅助mins存储每次push时的最小值;pop时辅助mins和数据data两同步pop。 时间复杂度O(1),空间复杂度(n)。 人生就是一个不断追求极致的过程,生活就是艺术——代码更是艺术。存在一个不太合理的地方——mins会保留大量冗余的最小值。如...

仰望星空 1895

PHP 算法 时间复杂度O(1) O(n)表示什么 空间复杂度

时间复杂度O(1) O(n)表示什么 在刷面试题中的算法题经常出现时间复杂度O(n),空间复杂度O(1)很多时候不知道是什么意思 空间复杂度与时间复杂度数据结构复杂度,在现在储存设备越来越便宜的时代,时间复杂度是决定程序运行速度的重要因素 算法时间复杂度是衡量计算性能的指标,反映了程序执行时间随着输入规模的增长而增长的量级,很大程度的反映出算法性能的好坏,这个量级用大写的O加()表示 从好到坏常用算法复杂度排序如下 O(1):常数级 最低复杂程度,使用时间或使用空间与输入数据大小没有关系,无论

托塔天王的博客 585

获得中的最小元素

Get Min value of Stack

如何用O(1)的时间复杂度最小元素

由于具有后进先出的特点,因此push和pop只需要对元素进行操作。 如果使用上述的实现方式,只能访问到顶的元素,而无法得到最小元素。当然,可以用另外一个变量来记录底的位置,通过遍历中的所有元素找出最小值,但是这种方法的时间复杂度为O(n)。 如何才能用O(1)的时间复杂度求出最小元素呢? 在算法设计中,经常会采用空间来换取时间的方式来提高时间复杂度,也就是说,采用额外的存储空间来降低操作的时间复杂度。具体来讲就是在实现时使用两个结构,一个用来存储数据,另一个用来存储.

wenchang-的博客 858

最小元素

两道简单题: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素。 push(x) —— 将元素 x 推入中。 pop() —— 删除顶的元素。 top() —— 获取元素。 getMin() —— 检索中的最小元素。 LeetCode 设计了一款新式键盘,正在测试其可用性。测试人员将会点击一系列键(总计 n 个),每次一个。 给你一个长度为 n 的字符串 keysPressed ,其中 keysPressed[i] 表示测试序列中第 i 个被按下的键。relea

abchhhxz的博客 3363

剑指offer第十七题(Java):包含min函数的

包含min函数的 题目描述 定义数据结构,请在该类型中实现一个能够得到中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当为空的时候,对调用pop()或者min()或者top()方法。 题目解析 在min函数中,找出最小的数,用迭代器来实现 主要熟悉中的一些方法: 1 boolean empty() 测试堆是否为空。 2 Object pee...

qq_44867490的博客 120

剑指offer:包含min函数的

一、题目描述 定义数据结构,请在该类型中实现一个能够得到中所含最小元素的min函数(时间复杂度应为O(1))。 解题思路 要实现算法的时间复杂度为O(1),常规的排序算法无法达到; 另外考虑只需选出最小元素,因此可通过没一个进来与前一个比较,始终存储最小的值来进行实现。 二、实现代码 class Solution { public: void push(int valu...

yph001的博客 259

如何用O(1)的时间复杂度最小元素

由于具有先进后出的特点,push和pop也只能对元素进行操作。而题目要求的是在O(1)的时间复杂度求得最小元素,显然是不可以遍历求取的。这里可以用两个实现,一个用来存取数据,另一个用来存最小元素。思路如下:如果当前入元素最小中的元素还小,则如最小。在出时,如果当前出元素正好是最小元素,则最小元素也出。 import java.util.Stack;

afd_326的专栏 1533

用O(1)的时间复杂度最小元素

题目:用O(1)的时间复杂度最小元素 思路:要找到里的最小元素,最简单的方法是对进行遍历,找出最小值,但是这样的方法的时间复杂度为O(n)。在算法设计中,我们可以采取用空间换时间的方法来提高算法的时间复杂度,也就是采用额外的存储空间来降低操作的时间复杂度。具体实现就是使用两个结构,一个用来存储数据,另一个用来存储最小元素,如果当前入元素比原来最小值还小,则把这个压入最...

VicterTian的博客 1052

特殊(返回最小值)时间复杂度o(1

题目要求 实现一个特殊的实现的基本功能基础上,在实现返回最小元素的操作,并且复杂度为o(1实现思路 准备一个和一个辅助,压入第一个元素时同时向和辅助压入第一个元素, 之后每压一次都将该元素和辅助对应上一个元素比较,压元素大于辅助对应前一个元素, 就再次压入上一个元素到辅助,否则向辅助压入当前元素 这样辅助顶就是我们需要的最小元素 举个例子: 4 5 3 9 1 0 : 辅助 压入4 压入4 压入5 压入4(5和辅助上一个元素

WormholeStack 1051

用时间复杂度O(1)的算法求中的最小元素

总体思想是以空间来换时间,设置两个,其中一个元素,一个最小的值,在push时,判断新push进去的元素和原先中的元素哪个小,小的才有资格入;在pop元素时候,要记得将存放最小值的元素也pop出来。很简单。实现用链表的实现方式。/* * 用O(1)的时间复杂度中的最小元素 */ public class MyStack1 { LinkedStack<Integ

qq356653246的博客 579

week 1实现一个特殊的,在实现的基本功能的基础上,在实现返回最小元素的操作。

topic requirement: 1.pop,push,getmin,操作的时间复杂度都是0( 1 ); 2.设计的类型可以使用现成的的结构。 thoughts:考虑时间复杂度是O(1),用两个实现此特殊。 the first method: 两个同时压入,同时弹出 the second method: 当前数...

const 308

实现一个特殊的,在实现基本功能的基础上,在实现返回中的最小元素 (要求:pop,push,getMin操作的时间复杂度都是O(1),设计类型可以使用现成的结构)

题目:实现一个特殊的,在实现基本功能的基础上,在实现返回中的最小元素 (要求:pop,push,getMin操作的时间复杂度都是O(1),设计类型可以使用现成的结构) 代码: package basic_class_03; import java.util.Stack; /** * 类名:Code_02_GetMinStack<br> * 功能:实现一个特殊的,在实现基本...

weixin_42417704的博客 304

实现一个Stack,要求实现Push(出)、Pop(入)、Min(返回最小值的操作)的时间复杂度为O(1)

#include <stack> #include <assert.h>template <typename T> class StackWithMin { public: StackWithMin(void) {} virtual ~StackWithMin(void) {} T& top(void); const T& top(void) const; voi

dcjhyn的博客 878

快速寻找最小元素

问题:定义数据结构,请在该类型中实现一个能够得到最小元素的min函数。 思路: 1、C++之简介: 是一种先进后出(FILO)的数据结构,在C++的库 中。提供了几个常用操作:1)入:std::stack::push(); 2):std::stack::pop(); 3)访问元素:std::stack::top(); 4)空判断:std::stack::empt

Hellouestc的博客 1668

获取最小元素

public class MinStack { private Stack<Integer> mainStack = new Stack<Integer>(); private Stack<Integer> minStack = new Stack<Integer>(); /** * 入操作 * @pa...

慕容的博客 755

_02)O(1)最小元素

155. 最小 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素。 push(x) —— 将元素 x 推入中。 pop()—— 删除顶的元素。 top()—— 获取元素。 getMin() —— 检索中的最小元素。 示例: 输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,nu...

jasscical's blog 522

Min——用O(1)时间复杂度返回当前最小元素

题目描述: 定义数据结构,要求添加一个Min函数,能够得到当前中的最小元素。 要求函数min,push,pop的时间复杂度都是O(1). 思路:另外用一个最小做辅助结构,记录中的最小元素元素中保存要入元素最小保存当前的最小元素。 具体过程如下:        1)、入时,先入元素,同时与最小元素比较,如果比元素小,则最小元素最小

拂晓的专栏 2800
上一篇: 用两个栈来实现队列
下一篇: python+pytest+selenium自动化测试图片搜索功能
Youga123
博客等级 码龄12年 31粉丝 · 29原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值