59 - I. 滑动窗口的最大值
算法思想:
使用两个指针i,j分别指向滑动窗口左端和右端。将数组元素放入一个队列中,要求:
1.队列中必须只包含滑动窗口中的元素,这就需要比较队列中第一个元素和nums[i-1],若相等,则进行出队操作,若不等,则说明此元素在之前已执行出队列操作。
1.队首必须是滑动窗口中的最大元素,且队列需满足非严格递减,即每次将nums[j]和队列中最后一个元素进行比较,若大于最后一个元素,则执行出队操作。最后将nums[j]插入队列尾部。
代码:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0 || k == 0){
return new int[0];
}
LinkedList<Integer> queue = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
for(int j = 0, i = 1 - k; j < nums.length; ++i, ++j){
if(i > 0 && queue.getFirst() == nums[i-1] ){
queue.pop();
}
while(!queue.isEmpty() && queue.getLast() < nums[j]){
queue.removeLast();
}
queue.addLast(nums[j]);
if(i >= 0){
res[i] = queue.getFirst();
}
}
return res;
}
}
26. 树的子结构
算法思想:
相当于使用递归的思想分别前序遍历A,A的左子树,A的右子树,A的左子树的左子树…判断与B是否相同。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}
public boolean recur(TreeNode A, TreeNode B){
if(B == null) return true;
if(A == null || A.val != B.val) return false;
return recur(A.left, B.left) && recur(A.right, B.right);
}
}