2024年Go最全【LeetCode刷题日记】[剑指 Offer 30(3),2024年最新最新BAT大厂面试者整理的Golang面试题目模板

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • minStackPush(obj, x);

  • minStackPop(obj);

  • int param_3 = minStackTop(obj);

  • int param_4 = minStackMin(obj);

  • minStackFree(obj);
    */


### 解题思路


此题要求写一个栈,与普通栈不同的是多出了一个获取最小值的方法。由于栈比较简单,这里就不多说了,主要还是说说怎么以 O(1) 的时间复杂度查找栈中的最小值。


使用一个变量 min 记录每次栈中的最小值,每次有元素进栈都对 min 进行更新。  
 这个方法存在一个问题,没有考虑出栈时,怎么对 min 进行更新。  
 为了解决出栈对最小值的更新,可以设定一个辅助栈,栈顶表示当前数据栈中的最小值,每次有元素入栈,就将当前最小值入辅助栈。出栈时,辅助栈也要将栈顶元素出栈,这就解决了出栈时的最小值更新问题。  
 push:将数据入栈的同时,更新最小值。如果入栈元素大于辅助栈顶元素(也就是元素入栈前,数据栈中的最小值),则最小值依旧是数据栈原来的最小值,否则将元素入辅助栈。


![GIF 2021-8-6 18-17-13.gif](https://img-blog.csdnimg.cn/img_convert/d16c07a1df82446347ea139dce8197f9.gif)


**pop**:将数据栈和辅助栈的栈顶元素同时出栈,保持辅助栈的栈顶元素是数据栈中的最小值。


![GIF 2021-8-6 18-23-10.gif](https://img-blog.csdnimg.cn/img_convert/77d13c246b407d1b9e6e6333393c5a63.gif)


C



#define max_size 10000
//x_stack存储正常入栈元素,min_stack用来存储入栈时栈中最小的元素
//x_top和min_top分别为栈顶的下标
//min_value用来存储最小值
typedef struct {
int *x_stack;
int *min_stack;
int x_top;
int min_top;
int min_value;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
MinStack obj = (MinStack)malloc(sizeof(MinStack));
obj->x_stack = (int*)malloc(sizeof(int) * max_size);
obj->min_stack = (int*)malloc(sizeof(int) * max_size);
obj->min_top = obj->x_top = -1;
obj->min_value = 0;
return obj;
}

void minStackPush(MinStack* obj, int x) {
if(obj->x_top < max_size)
{
if(obj->x_top == -1)
obj->min_value = x;
obj->x_stack[++(obj->x_top)] = x;
if(x < obj->min_value)
obj->min_value = x; //当前元素比min_value小时改变min_value
obj->min_stack[++(obj->min_top)] = obj->min_value;
}
}

void minStackPop(MinStack* obj) {
–(obj->x_top);
–(obj->min_top);
if(obj->min_top != -1)
obj->min_value = obj->min_stack[obj->min_top];//出栈后将min_value变成min_stack的栈顶元素
}

int minStackTop(MinStack* obj) {
return obj->x_stack[obj->x_top];
}

int minStackMin(MinStack* obj) {
return obj->min_stack[obj->min_top];
}

void minStackFree(MinStack* obj) {
free(obj->x_stack);
free(obj->min_stack);
free(obj);
}

/**

  • Your MinStack struct will be instantiated and called as such:

  • MinStack* obj = minStackCreate();

  • minStackPush(obj, x);

  • minStackPop(obj);

  • int param_3 = minStackTop(obj);

  • int param_4 = minStackMin(obj);

  • minStackFree(obj);
    */


C++



方法:维护一个数据栈和一个辅助栈。数据栈用于存放每次新进入的x,辅助栈用于存放每个x进入数据栈后,数据栈中已有元素的最小值(即辅助栈的top()始终存放着当前数据栈的最小值)。数据栈中的元素个数始终等于辅
助栈中的元素个数。
先放C++代码,思路简单易懂。

class MinStack {
public:
/** initialize your data structure here. */
stack data, help;
MinStack() {

}

void push(int x) {
    data.push(x);
    // 如果x是data和help的第一个元素,或者x小于等于help的最小元素,入栈
    if(help.empty() || x <= help.top()) help.push(x);
    if(x > help.top())
    {
        // 如果x大于help的最小元素,向help中再压入一遍该最小元素,保持两个栈元素个数相等
        // 比如data里现在有3,help里现在也有3,data里压入一个4,那么help里压入一个3
        // 这样如果把data的4弹出,我们同步把help的3也弹出
        int temp = help.top();
        help.push(temp);
    }
}

void pop() {
    if(!data.empty() && !help.empty())
    {
        data.pop();
        help.pop();
    }
}

int top() {
    return data.top();
}

int min() {
    return help.top();
}

};

/**

  • Your MinStack object will be instantiated and called as such:
  • MinStack* obj = new MinStack();
  • obj->push(x);
  • obj->pop();
  • int param_3 = obj->top();
  • int param_4 = obj->min();
    */





![img](https://img-blog.csdnimg.cn/img_convert/cb84a13200beb782a0c78fb0c2e55cf6.png)
![img](https://img-blog.csdnimg.cn/img_convert/7342688637040a1fdd435df2d7308d40.png)
![img](https://img-blog.csdnimg.cn/img_convert/8cdd88cebfb34ff9590e131778e3ca75.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值