例 1:二叉树的层次遍历
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (queue.size() > 0) {
int number = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < number; i ++) {
TreeNode curNode = queue.poll();
list.add(curNode.val);
if (null != curNode.left) {
queue.offer(curNode.left);
}
if (null != curNode.right) {
queue.offer(curNode.right);
}
}
res.add(list);
}
return res;
}
}
填充每个节点的下一个右侧节点指针 II
题解:
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
class Solution {
public Node connect(Node root) {
if (null == root) {
return root;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (queue.size() > 0) {
int number = queue.size();
for (int i = 0; i < number; i ++) {
Node curNode = queue.poll();
if (number - 1 != i) {
curNode.next = queue.peek();
}
if (null != curNode.left) {
queue.offer(curNode.left);
}
if (null != curNode.right) {
queue.offer(curNode.right);
}
}
}
return root;
}
}
662. 二叉树最大宽度
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private class Pair {
private TreeNode node;
private int id;
public Pair(TreeNode node, int id) {
this.node = node;
this.id = id;
}
}
public int widthOfBinaryTree(TreeNode root) {
int ans = 0;
Queue<Pair> queue = new LinkedList<>();
queue.offer(new Pair(root, 1));
while (queue.size() > 0) {
int curSize = queue.size();
int start = -1;
int end = -1;
for (int i = 0; i < curSize; i ++) {
Pair curPair = queue.poll();
if (-1 == start) {
start = curPair.id;
}
end = curPair.id;
if (null != curPair.node.left) {
queue.offer(new Pair(curPair.node.left, curPair.id << 1));
}
if (null != curPair.node.right) {
queue.offer(new Pair(curPair.node.right, (curPair.id << 1) + 1));
}
}
ans = Math.max(ans, end - start + 1);
}
return ans;
}
}
103. 二叉树的锯齿形层序遍历
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean isOrderLeft = true;
while (!queue.isEmpty()) {
int size = queue.size();
Deque<Integer> deque = new LinkedList<>();
for (int i = 0; i < size; i ++) {
TreeNode curNode = queue.poll();
if (isOrderLeft) {
deque.offerLast(curNode.val);
} else {
deque.offerFirst(curNode.val);
}
if (null != curNode.left) {
queue.offer(curNode.left);
}
if (null != curNode.right) {
queue.offer(curNode.right);
}
}
isOrderLeft = !isOrderLeft;
res.add(new ArrayList<>(deque));
}
return res;
}
}
107. 二叉树的层序遍历 II
题解:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i ++) {
TreeNode curNode = queue.poll();
list.add(curNode.val);
if (null != curNode.left) {
queue.offer(curNode.left);
}
if (null != curNode.right) {
queue.offer(curNode.right);
}
}
res.add(0, list);
}
return res;
}
}
622. 设计循环队列
题解:
class MyCircularQueue {
int size;
int k;
int head;
int tail;
int[] data;
public MyCircularQueue(int k) {
size = 0;
head = -1;
tail = 0;
this.k = k;
data = new int[k];
}
public boolean enQueue(int value) {
if (this.isFull()) {
return false;
}
data[tail] = value;
tail = (tail + 1) % k;
size ++;
if (-1 == head) {
head = 0;
}
return true;
}
public boolean deQueue() {
if (this.isEmpty()) {
return false;
}
head = (head + 1) % k;
size --;
return true;
}
public int Front() {
if (this.isEmpty()) {
return -1;
}
return data[head];
}
public int Rear() {
if (this.isEmpty()) {
return -1;
}
if (0 == tail) {
return data[k - 1];
} else {
return data[tail - 1];
}
}
public boolean isEmpty() {
return 0 == this.size;
}
public boolean isFull() {
return this.k == this.size;
}
}
在取模的时候,如果需要向前移动,不要写成 (i - 1) % capacity,注意一定要加上 capacity 之后再取模,否则在 i = 0 的时候就出错了。
pre = (i - 1 + capacity) % capacity
单调队列(解决区间最值问题)
例 3:滑动窗口的最大值
class Solution {
private Deque<Integer> deque = new ArrayDeque<>();
private void push(int val) {
while (!deque.isEmpty() && deque.getLast() < val) {
deque.removeLast();
}
deque.addLast(val);
}
private void pop(int val) {
if(!deque.isEmpty() && deque.getFirst() == val) {
deque.removeFirst();
}
}
public int[] maxSlidingWindow(int[] nums, int k) {
final int n = nums.length;
int[] ans = new int[n - k + 1];
for (int i = 0; i < n; i ++) {
this.push(nums[i]);
if (i < k - 1) {
continue;
}
ans[i - k + 1] = deque.getFirst();
this.pop(nums[i - k + 1]);
}
return ans;
}
}
例 4:捡金币游戏
题解:
class Solution {
private Deque<Integer> deque = new ArrayDeque<>();
private void push(int val) {
while (!deque.isEmpty() && deque.getLast() < val) {
deque.removeLast();
}
deque.addLast(val);
}
private void pop(int val) {
if (!deque.isEmpty() && deque.getFirst() == val) {
deque.removeFirst();
}
}
public int maxResult(int[] nums, int k) {
final int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
this.push(dp[0]);
for (int i = 1; i < n; i ++) {
int temp = deque.getFirst() + nums[i];
this.push(temp);
dp[i] = temp;
if (i - k >= 0) {
this.pop(dp[i - k]);
}
}
return dp[n - 1];
}
}