【LeetCode刷题日记】[剑指 Offer 30,2024年最新不看绝对血亏

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

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

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

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

MinStack* minStackCreate() {

}

void minStackPush(MinStack* obj, int x) {

}

void minStackPop(MinStack* obj) {

}

int minStackTop(MinStack* obj) {

}

int minStackMin(MinStack* obj) {

}

void minStackFree(MinStack* 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);
    */

解题思路

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

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

GIF 2021-8-6 18-17-13.gif

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

GIF 2021-8-6 18-23-10.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();

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-L01Hfr9g-1713176078138)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值