算法--2023.1.17

1.力扣236--二叉树的最近公共祖先

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null){
            return root;
        }
        //如果根结点是p或者q,则根结点就是最近的公共祖先
        if(root == p || root ==q){
            return root;
        }
        //否则,递归的遍历根结点的左子树是否有公公祖先,右子树是否有公共祖先
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        //如果左右子树都有公公祖先,则返回根结点
        if(left!=null&&right!=null){
            return root;
        //否则返回左子树或者右子树节点    
        }else if(left!=null){
            return left;
        }else{
            return right;
        }
        
    }
}

2.力扣238--除自身以外数组的乘积

class Solution {
    public int[] productExceptSelf(int[] nums) {
        int n = nums.length;
        //前缀乘积数组,后缀乘积数组,类似于前缀和与后缀和
        int[] preMulti = new int[n+1], postMulti = new int[n+2];
        preMulti[0] = 1; postMulti[n+1] = 1;
        for(int i = 1;i<=n;i++){
            preMulti[i] = nums[i-1]*preMulti[i-1];
        }
        for(int i = n;i>=1;i--){
            postMulti[i] = postMulti[i+1] * nums[i-1];
            //System.out.println(postMulti[i]);
        }
        int[] res = new int[n];
        for(int i = 0;i<n;i++){
            res[i] = preMulti[i] * postMulti[i+2];
        }
        return res;

    }
}

3.力扣239--滑动窗口的最大值

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        //维护一个滑动窗口,该滑动窗口由一个单调队列作为容器
        Deque<Integer> queue = new LinkedList<>();
        int n = nums.length;
        int[] res = new int[n-k+1];
        for(int i = 0;i<n;i++){
            //每次进入前先判断窗口最左边的值是否要移除
            if(!queue.isEmpty()&&i-queue.getFirst()+1>k){
                queue.removeFirst();
            }
            //这里来维护一个单调递减的队列
            //队列中新加入的元素一定要把队列中它前面比他大的给移除
            while(!queue.isEmpty()&&nums[i]>=nums[queue.getLast()]){
                queue.removeLast();
            }
            queue.addLast(i);
            //然后每次输出滑动窗口的第一个元素就可以了
            if(i>=k-1){
                res[i-k+1] = nums[queue.getFirst()];
            }
        }
        return res;
    }
}

  

  

  

posted @ 2023-01-18 16:15  lyjps  阅读(17)  评论(0)    收藏  举报