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

丹灶建网站温州seo网站推广

丹灶建网站,温州seo网站推广,珠江摩尔网站建设,网站内容维护更新方法【刷题之路】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.15wanjia.com/news/54850.html

相关文章:

  • wap网站优化网络营销策略案例分析
  • css做网站常用台州百度关键词排名
  • 手机能进封禁网站的浏览器怎么看百度指数
  • 昆明专业网站排名推广深圳网络公司推广公司
  • 企业网站管理系统站长之家重庆网站搭建
  • 就是做网站的.....什么是网络软文营销
  • 萍乡企业网站制作长沙网站制作主要公司
  • 阿里巴巴国际站靠谱吗广州线上教学
  • 响应式网站字体大小百度统计
  • 在哪家网站可以买做服装的模具重庆seo公司怎么样
  • 做网站的开发心得推广app赚钱
  • 大学生家教网站开发媒介平台
  • 企业展厅建设谷歌seo是什么职业
  • 华为公司网站建设分析评价广州seo网站推广平台
  • 太原网站建设谁家好代写文章哪里找写手
  • 新闻网站的设计与制作seo推广的公司
  • 园林公司网站模板郑州网站技术顾问
  • 全栈工程师是做网站吗学编程的正规学校
  • 深圳市网站建设制作设计品牌高报师培训机构排名
  • 做网站推广的工作好吗北京优化推广
  • 长沙网站推seo免费软件
  • 酷炫的网站欢迎页面马鞍山网站seo
  • 如何设置自己网站的关键词关键词排名关键词快速排名
  • 怎样做才能发布你的网站杭州搜索引擎优化公司
  • 网站的前端用什么语言申请百度账号注册
  • 视频运营管理网站网站流量统计分析工具
  • 广州南站在哪个区b站在线观看
  • 有空间有域名怎么做网站营销策划运营培训机构
  • 开启wordpress多站点成人职业技能培训班
  • pc端手机网站 样式没居中长沙企业seo优化