当前位置: 首页 > news >正文

省规划建设发展局网站首页前程无忧企业官方网站

省规划建设发展局网站首页,前程无忧企业官方网站,dw网页素材,塘厦网站建设【刷题之路】LeetCode 面试题 03.02. 栈的最小值 一、题目描述二、解题1、方法1——“辅助栈”1.1、思路分析1.2、代码实现 一、题目描述 原题连接: 面试题 03.02. 栈的最小值 题目描述: 请设计一个栈,除了常规栈支持的pop与push函数以外&am…

【刷题之路】LeetCode 面试题 03.02. 栈的最小值

  • 一、题目描述
  • 二、解题
    • 1、方法1——“辅助栈”
      • 1.1、思路分析
      • 1.2、代码实现

一、题目描述

原题连接: 面试题 03.02. 栈的最小值
题目描述:
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

二、解题

1、方法1——“辅助栈”

1.1、思路分析

既然题目应经明确要求了,min操作的时间复杂度必须为O(1),那我们想用遍历的方法来找到最小值的想法也就不现实了,那我们应该怎样解决这个O(1)的问题呢?
我们可以借助一个辅助的栈minStack,来存储当前栈中最小的值当我们每次执行push时候,就相应的将当前栈中最小的值也入到minStack中。即minStack的栈顶元素就是当前栈中最小的值:
在这里插入图片描述

具体的操作是:
1、当栈为空时,统一将新压入栈的元素压入到Stack和minStack。
2、当栈不为空时,如果新压入栈的元素小于minStack栈顶的元素,就将新的元素压入minStack中,否则则继续将minStack的栈顶元素压入minStack。

然后当我们要执行min操作时,就直接返回minStack的栈顶元素及可。
而当我们执行Pop弹栈操作时,则需要让Stack和minStack同步弹栈,以确保在任何情况下minStack的栈顶元素都为Stack中的最小值。
有的朋友可以会有疑问:难道要在栈中再嵌套定义一个子栈,然后执行各项操作的时候同时对这个子栈在执行相应的接口?
其实么这个必要,我们只需要在栈中额外定义一个存储结构来存储当前栈中的最小值即可。就比如我们选用数组来实现栈,那我们就再额外定义一个数组来存储栈中的最小值,比如下面这样:

typedef struct {int *data;int size; // 当前栈中的数据个数int capacity; // 当前栈的容量int *minStack; // 数组模拟一个栈,存储对应的最小值
} MinStack;

然后其实size和capacity是可以被data和minStack共用的,因为它们是同步Push和Pop操作的。

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:
初始化工作:

typedef struct {int *data;int size;int capacity;int *minStack; // 数组模拟一个栈,存储对应的最小值
} MinStack;MinStack* minStackCreate() {MinStack *stack = (MinStack*)malloc(sizeof(MinStack));if (NULL == stack) {perror("malloc fail!\n");exit(-1);}stack->data = NULL;stack->minStack = NULL;stack->size = 0;stack->capacity = 0;return stack;
}

压栈接口Push:
因为data和minStack是同并且共用size和capacity的,所以在增容时候也需要同步增容data和minStack。

void minStackPush(MinStack* obj, int x) {// 先检查是否需要增容if (obj->size == obj->capacity) {int newCapacity = obj->capacity == 0 ? 10 : 2 * obj->capacity;int *temp1 = (int*)realloc(obj->data, newCapacity * sizeof(int));if (NULL == temp1) {perror("realloc fail!\n");exit(-1);}int *temp2 = (int*)realloc(obj->minStack, newCapacity * sizeof(int));if (NULL == temp2) {perror("realloc fail!\n");exit(-1);} obj->data = temp1;obj->minStack = temp2;obj->capacity = newCapacity;}if (obj->size == 0) {obj->minStack[obj->size] = x;} else {int min = x < obj->minStack[obj->size - 1] ? x : obj->minStack[obj->size - 1];obj->minStack[obj->size] = min;}obj->data[obj->size] = x;obj->size++;
}

弹栈Pop接口:

void minStackPop(MinStack* obj) {assert(obj->size != 0);obj->size--;
}

取栈顶Top接口:

int minStackTop(MinStack* obj) {assert(obj->size != 0);return obj->data[obj->size - 1];
}

求最小值min接口:

int minStackGetMin(MinStack* obj) {assert(obj->size != 0);return obj->minStack[obj->size - 1];
}

释放free接口:

void minStackFree(MinStack* obj) {free(obj->data);free(obj->minStack);obj->data = NULL;obj->minStack = NULL;obj->size = 0;obj->capacity = 0;
}
http://www.yayakq.cn/news/51422/

相关文章:

  • 贵州省建设网官方网站网站前台图片设置
  • 微课做动画的网站网络推广优化工具
  • 国内高端品牌网站建设网站源代码怎么放入 dede网站后台
  • 阿里网站销量做不起来怎么办南通装修网站大全
  • 济南定机票网站建设专业模板网站设计公司
  • 福州建网站哪家好鞍山在网络做推广
  • 单页面网站有哪些内容wordpress文件管理
  • 工作是套模板做网站怎样使用网站后台的模板
  • 天津建设局网站莱芜区宣传部网站
  • 互联网之光博览会企业网站seo工作
  • 晒豆网站建设网站项目经费预算
  • 门户网站优化怎么做网站怎样做移动端适配
  • 网站建设方案行业网络营销策略分析方法
  • 酒店网站解决方案查找人网站 优帮云
  • oppo网站开发设计在互易上做的网站如何修改
  • 怎么做金融营销网站全国网站开发公司
  • 红酒企业网站建设网页设计面试常见问题
  • 立码软件做网站凡科互动小程序官网
  • 如何选技能网站建设网站注册费
  • 网站设计自己申请asp.net 建网站
  • 投放广告的网站杭州专业网站
  • 深圳网站制作的公司网络服务企业网盘源码
  • 在线设计平台网站自适应网站建设软件
  • 农家院网站素材公司起名网站
  • 自己怎么做卡密网站php mysql网站开发
  • 电商网站开发脑图小学生编程软件
  • 如何利用云服务器进行网站建设小型企业网站设计与制作
  • 如今做那些网站致富珠海正规网站制作合作
  • 上海网站推广汉狮腾讯风铃怎么建设网站
  • 网站怎么做支付宝付款国内永久免费域名注册