Saturday, November 29, 2014
Sunday, November 23, 2014
Java consumer producers problem using mutex
http://java67.blogspot.com/2012/12/producer-consumer-problem-with-wait-and-notify-example.html?m=1
156. Binary Tree Upside Down ---M ~~~~做了3遍的, 竟然忘了~~~~
Given the root of a binary tree, turn the tree upside down and return the new root.
You can turn a binary tree upside down with the following steps:
- The original left child becomes the new root.
- The original root becomes the new right child.
- The original right child becomes the new left child. 
The mentioned steps are done level by level, it is guaranteed that every node in the given tree has either 0 or 2 children.
Example 1:
Input: root = [1,2,3,4,5] Output: [4,5,2,null,null,3,1]
Example 2:
Input: root = [] Output: []
Example 3:
Input: root = [1] Output: [1]
Constraints:
- The number of nodes in the tree will be in the range [0, 10].
- 1 <= Node.val <= 10
- Every node has either 0 or 2 children.
这个题目描述的很烂。
应该是: binary tree upside down along left most edge
Iterative bottom up.
就是先做左子树,再连接修改该节点。
就是先做左子树,再连接修改该节点。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode* upsideDownBinaryTree(TreeNode* root) { if(not root){ // if nullptr , or no child return root; } stack<TreeNode*> S; TreeNode *runner = root; while(runner->left ){ S.push(runner); runner = runner->left; } TreeNode * newRoot = runner; while(not S.empty()){ auto p = S.top(); S.pop(); runner->right = p; runner->left = p->right; p->left = nullptr; p->right = nullptr; runner = p; } return newRoot; } };
错误: 
没有先把  p.right = nullptr; 这个题比较tricky的点就是,要事先找到return 的newRoot.
------------Recursive approach--------先找到 返回TreeNode, 这样就不需要在helper()中管了--------
这里利用了一个性质,就是指针指向的Node只做了child 指针的更改操作。原本的Object 位置并没有更改。
Mistakes:
1: base case中,忘了把root.left==null的情况加进来(否则会有null pointer的Exception)
------------Recursive approach--------先找到 返回TreeNode, 这样就不需要在helper()中管了--------
public class Solution {
    public TreeNode upsideDownBinaryTree(TreeNode root) {
        if(root == null)
            return null;
        TreeNode leftMost = root;
        while( leftMost.left != null)
            leftMost = leftMost.left;
            
        helper(root);
        return leftMost;
    }
    private void helper(TreeNode  root){
        if(root.left == null)
            return;
        upsideDownBinaryTree(root.left);
        
        TreeNode newRoot = root.left;
        newRoot.left = root.right;
        newRoot.right = root;
        
        root.left = null;
        root.right = null;
    }
}
这里利用了一个性质,就是指针指向的Node只做了child 指针的更改操作。原本的Object 位置并没有更改。
Mistakes:
1: base case中,忘了把root.left==null的情况加进来(否则会有null pointer的Exception)
public class Solution {
    public TreeNode UpsideDownBinaryTree(TreeNode root) {
        if(root == null || root.left == null)
            return root;
        TreeNode newRoot = UpsideDownBinaryTree(root.left);
        
        TreeNode r= root.right;
        root.left =null;
        root.right = null;
        TreeNode runner = newRoot;
        while(runner!=null && runner.right!=null){
            runner = runner.right;
        }
        if(runner!=null){
            runner.left = r;
            runner.right = root;
        }
        return newRoot;
    }
}
Saturday, November 22, 2014
155. Min Stack (Medium)
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
Implement the MinStack class:
- MinStack()initializes the stack object.
- void push(int val)pushes the element- valonto the stack.
- void pop()removes the element on the top of the stack.
- int top()gets the top element of the stack.
- int getMin()retrieves the minimum element in the stack.
You must implement a solution with O(1) time complexity for each function.
Example 1:
Input ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] Output [null,null,null,null,-3,null,0,-2] Explanation MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); // return -3 minStack.pop(); minStack.top(); // return 0 minStack.getMin(); // return -2
Constraints:
- -231 <= val <= 231 - 1
- Methods pop,topandgetMinoperations will always be called on non-empty stacks.
- At most 3 * 104calls will be made topush,pop,top, andgetMin.
A:
思想很简单。后来出现memory out of limit, minStack中就没有存多余的最小值。
class MinStack { public: /** initialize your data structure here. */ vector<int> stack; vector<int> minStack; MinStack() { } void push(int x) { stack.push_back(x); if(minStack.empty() || minStack.back() > x) minStack.push_back(x); else minStack.push_back(minStack.back()); } void pop() { stack.pop_back(); minStack.pop_back(); } int top() { return stack.back(); } int getMin() { return minStack.back(); } }; /** * 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->getMin(); */
Learned:
1; minStack中,重复的最小值也要存。2:即使Stack<Integer>的返回值是一个对象,因此要用.equals()来比较大小
Subscribe to:
Comments (Atom)
 
