目录
1.offer07重建二叉树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**
O(N)
O(N)
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length == 0 | inorder.length == 0) {
return null;
}
int n = preorder.length;
TreeNode root = new TreeNode(preorder[0]);
for (int i = 0; i < n; i++) {
if (inorder[i] == root.val) {
root.left = buildTree(
Arrays.copyOfRange(preorder, 1,i + 1), Arrays.copyOfRange(inorder,0, i)
); //[0,i)
root.right = buildTree(
Arrays.copyOfRange(preorder, i + 1, n), Arrays.copyOfRange(inorder, i + 1, n)
); //[i + 1,n)
}
}
return root;
}
}
2.offer9用两个栈实现队列
/**
时间O(1)
空间O(N)
*/
class CQueue {
Deque<Integer> inStack;
Deque<Integer> outStack;
public CQueue() {
inStack = new ArrayDeque<Integer>();
outStack = new ArrayDeque<Integer>();
}
public void appendTail(int value) {
inStack.push(value);
}
public int deleteHead() {
if (outStack.isEmpty()) {
if (inStack.isEmpty()) {
return -1;
}
in2out();
}
return outStack.pop();
}
private void in2out() {
while (!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
}
3.offer10.1斐波那契数列
/**
O(N)
O(1)
*/
class Solution {
public int fib(int n) {
final int MOD = 1000000007;
if (n < 2) {
return n;
}
int p = 0, q = 0, r = 1;
for (int i = 2; i <= n; ++