博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小镇做题家|在 O(1)的时间内找到栈的最值
阅读量:3898 次
发布时间:2019-05-23

本文共 2381 字,大约阅读时间需要 7 分钟。

题目描述

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

这道题目是我在字节面试时遇到的真题,当初没想到最优解,复盘的时候发现是道简单题。。把这道题目作为栈的使用分享给大家!(在面试的时候没有想到最优解就先选择一个次优的解法,总比做不出来要好!)

传送门

LeetCode:

解题思路

栈可以看作是一个数组,在一个数组中找一个最值是很简单的,我们只需要遍历这个数组即可。在要求 O(1)时间内时,我们在进行数组赋值的时候记录下最值即可满足要求。但是要求在元素发生变动的时候也满足 O(1)的话,我们可以保存每次入栈时的最值。即用空间换时间!

图解:

--------------------------------values | 0 | -1 | 10 | -2 | -2 |--------------------------------min    | 0 | -1 | -1 | -2 | -2 |--------------------------------

从注释中可以看出,我们在添加元素的时候将传入的值与当前栈的最值进行判断即可得知在添加新元素之后栈的最值

解题代码

主体代码

#include 
#include
typedef struct MinStack{ /* data */ int len; // 元素长度 int index; // 新元素下标 int *values; // 值数组 int *min; // 最值数组} MinStack;// 初始化MinStack *init(int size){ // 申请空间 MinStack *stack = malloc(sizeof(MinStack)); // 初始化值 stack->index = 0; stack->len = 0; stack->values = malloc(sizeof(int) * size); stack->min = malloc(sizeof(int) * size); return stack;}// 入栈操作void push(MinStack *stack, int val){ // 指针为空直接返回 if (stack == NULL) { return; } // 将元素进行保存 stack->values[stack->index] = val; // 判断最值 if (stack->len > 0) { // 存在元素就与当前栈的最值进行比较 int lastMin = stack->min[stack->index - 1]; if (lastMin < val) { stack->min[stack->index] = lastMin; } else { stack->min[stack->index] = val; } } else { // 栈为空直接设置为最值 stack->min[stack->index] = val; } stack->index++; stack->len++;}// 出栈操作int pop(MinStack *stack){ // 栈为空 if (stack == NULL || stack->len < 1) { return 0xFFFFFF; } // 出栈 int val = stack->values[stack->index - 1]; // 更新下标和长度 stack->len--; stack->index--; return val;}// 获取最小值int min(MinStack *stack){ // 直接返回最值 return stack->min[stack->index - 1];}// 销毁栈对象void destory(MinStack *stack){ //释放空间 重置数据 stack->index = stack->len = 0; free(stack->min); free(stack->values);}

测试函数

int main(){    MinStack *stack = init(100);    push(stack, 1);    printf("min=%d\n", min(stack));    push(stack, -1);    push(stack, 100);    printf("min=%d\n", min(stack));    printf("pop=%d\n", pop(stack));    printf("len=%d\n", stack->len);    return 0;}

最近我也在用 Go 刷算法题攒代码熟练度,再结合一些数据结构的知识新开了这个系列。后续将会继续更新!

文中的代码我已上传到 gitlab:

以上就是本期的全部内容,感谢你的阅读!我们春节见,会有一些大的改动以及总结和在牛年的一些计划!

转载地址:http://rtden.baihongyu.com/

你可能感兴趣的文章
plsql oracle 无法解析指定的连接标识符
查看>>
Linux后台开发应该具备技能
查看>>
Eclipse Tomcat 无法添加项目
查看>>
SVN更新失败 解决方法
查看>>
关于Java的File.separator
查看>>
linux定时任务的设置
查看>>
MySQL 5.7 完全傻瓜安装教程 图文
查看>>
Hibernate框架概述&SSH框架工作原理以及流程
查看>>
Aapche POI txt 导入excel
查看>>
C语言 ## __VA_ARGS__ 宏
查看>>
C++项目中的extern "C" {}
查看>>
(转)C++中extern “C”含义深层探索
查看>>
【日常小记】linux中强大且常用命令:find、grep
查看>>
Linux多线程编程(不限Linux)
查看>>
C/C++内存泄漏及检测
查看>>
C中的继承和多态
查看>>
linux修改ssh端口和禁止root远程登陆设置
查看>>
What really happens when you navigate to a URL
查看>>
偶遇with ties
查看>>
linux 编译指定库、头文件的路径问题
查看>>