力扣刷题笔记3——定义类对象(不)加括号的区别以及点运算与箭头运算的区别

定义类对象(不)加括号的区别以及点运算与箭头运算的区别

问题来源

力扣的题:

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

我的代码


#include <iostream>
using namespace std;
#include <algorithm>

class MinStack {
public:
	/** initialize your data structure here. */
	MinStack() {

	}
	int minStack[20000] = { 0 };
	int count = -1;
	void push(int x) {
		minStack[++count] = x;
		cout << count;
	}

	void pop() {
		count--;
	}

	int top() {
		return minStack[count];
	}

	int min() {
		return *min_element(minStack, minStack + count+1);
	}
};

int main() {
	MinStack *minStack = new MinStack();
	(*minStack).push(-2);
	minStack->push(0);
	minStack->push(-3);
	cout << minStack->min();
	return 0;
}

在这里插入图片描述

力扣的示例代码

class MinStack {
private:
    stack<long> _s;
    long _min = INT_MAX;
public:
    /** initialize your data structure here. */
    MinStack() {
    }
    
    void push(int x) {
        _s.push((long)x - _min);
        if (x < _min) _min = x;
    }
    
    void pop() {
        if (_s.top() < 0) _min -= _s.top();
        _s.pop();
    }
    
    int top() {
        return (_s.top() > 0) ? _s.top() + _min : _min;
    }
    
    int min() {
        return _min;
    }
};

/**
 * 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();
 */
 /*
  * 3 2 5 1 9 0 1 0
  * 3 2 1 0 0
  */

代码思考

   看了示例代码,我感觉自己写的真的傻逼。我本来也想用栈来实现,打算用一个数来记录最小值。但是考虑到如果栈里有重复的数,那我就还得记录这个最小值有几个。而且如果最小值pop了,那我还得找到新的最小值,这感觉很难以O(1)的复杂度实现。
   这个示例代码存入的每一个值都跟上一个值或者最小值有关,很妙。

C++代码问题

  1. new关键字创建对象时,因为这个类只有内置类型的成员,所以加不加括号没啥区别。
    其他的各种关于括号的研究可以看这篇:https://blog.csdn.net/spaceyqy/article/details/22730939
MinStack *minStack = new MinStack();//new MinStack;
  1. 点运算与箭头运算的区别
    我本来是想直接用点运算的,但是报错说“.push左边必须有类/结构/联合”。我就查了下,得按下面的两种方法写才行。意思就是,点运算是用在实体的,箭头运算是用在指针的。具体的说法可以看这篇:https://blog.csdn.net/weixin_51671868/article/details/120296543
	(*minStack).push(-2);
	minStack->push(0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zx-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值