刷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());
    }
};
Leetcode_173

  他人代码:最快的是<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_155

 

以上是关于刷Leetcode心得的主要内容,如果未能解决你的问题,请参考以下文章

资料 | 从 0 开始刷 LeetCode 的心得记录

从心出发-刷leetcode写给5年后的自己

这个开源项目教你如何刷爆 LeetCode

刷HDOJ 的心得体会

[LeetCode] 系统刷题1_代码风格及边界

刷leetcode习题