刷Leetcode心得
Posted tsuko
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷Leetcode心得相关的知识,希望对你有一定的参考价值。
自10月来,我用了3个个多月,做了大概120题, 感觉编码水平有所提升。
前120题还未总结,先记录这几天学到的东西。
Leetcode-173: BST迭代器设计
语言:C++
简介:说白了,就是BST的非递归中序遍历,需要一个栈做辅助结构。
测试结果: 40ms
空间复杂度:与树高成正比,最好情况是右斜树,O(1);最坏是左斜树,需要O(n)。
分析:
先分析中序遍历的遍历路径,确定子树根root, 左孩子left, 右孩子right怎么存放在stack中。
然后是对整棵树的划分,一开始我是打算先存right,再存root,再令root = root->left,迭代存储直到root为空。 但是这样会导致一个问题,弹出栈顶,新的栈顶top与top-1这两个节点有两种关系(root->left与root, root与root->right),要编写额外的判断代码,不好搞。
后来想到,栈中只存左子节点,也就是只存root, root->left, root->left->left, .... ,这样子, 每次产生新栈顶的时候只需要检查新栈顶的右子节点,迭代地压入root->left..就可以了,下面是代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class BSTIterator { public: std::stack<TreeNode* > st; BSTIterator(TreeNode* root) { TreeNode* ptr = root; while(ptr != NULL){ st.push(ptr);// 只存左斜子树根,则st内节点只需要检查右子节点 ptr = ptr->left; } } /** @return the next smallest number */ int next() { // 假设不空 TreeNode* res = st.top(); st.pop(); TreeNode* ptr = res->right; while(ptr != NULL){ st.push(ptr);// 只存左斜子树根,则st内节点只需要检查右子节点 ptr = ptr->left; } return res->val; } /** @return whether we have a next smallest number */ bool hasNext() { return !(st.empty()); } };
他人代码:最快的是<10ms, 其基本思路是先一次性递归中序遍历整棵树,将结果依次存到数组中。
Leetcode-155: 最小栈
语言:C++
简介:就是设计一个栈,使得其有特殊的getMin()方法,可以在O(1)内取得栈中最小值。
分析:没思路,看hint。
这个题目是典型的空间换时间,做法是用双倍空间,一半空间是依次压入的元素, 另一半是栈中最小的元素,比如:压入2, 3, 4 ,1
ST_1: 2 3 4 1
ST_2: 2 2 2 1
在编码的时候用了二元组(val, min_val)作为栈的元素。
深入一点地讨论:如上面的例子,ST_2中只有两种元素2, 1, -----------------------------------------
代码如下:
class MinStack { public: /** initialize your data structure here. */ // (num, min_num) std::stack<std::pair<int, int> > st; MinStack():st() { ; } void push(int x) { // empty stack int min_num = x; if (!st.empty() && x > st.top().second) min_num = st.top().second; st.push(std::make_pair(x, min_num)); } void pop() { if (!st.empty()){ st.pop(); } } int top() { // st may be empty. return st.top().first; } int getMin() { return st.top().second; } };
以上是关于刷Leetcode心得的主要内容,如果未能解决你的问题,请参考以下文章