剑指offer 2021/7/21

43 篇文章 0 订阅
27 篇文章 0 订阅
本文介绍了两种常见的算法问题:59-I.滑动窗口的最大值和26.树的子结构。对于滑动窗口最大值,通过使用双指针和队列实现,保持队列非严格递减并始终包含滑动窗口内的最大值。对于树的子结构问题,通过递归的前序遍历判断一棵树是否包含另一棵树的子结构。这两个算法展示了在数组处理和树结构搜索中的高效方法。
摘要由CSDN通过智能技术生成

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值