zoukankan      html  css  js  c++  java
  • LeetCode第188周 周赛

    RT太菜了,只做出前3题,hard永远做不出来

    周赛第一题 5404. 用栈操作构建数组

    给你一个目标数组 target 和一个整数 n。每次迭代,需要从  list = {1,2,3..., n} 中依序读取一个数字。
    请使用下述操作来构建目标数组 target :
    Push:从 list 中读取一个新元素, 并将其推入数组中。
    Pop:删除数组中的最后一个元素。
    如果目标数组构建完成,就停止读取更多元素。题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。请返回构建目标数组所用的操作序列。题目数据保证答案是唯一的。

    思路

    直接一次遍历,只存在两种情况,当前num=target[index]或者当前num<target[index],因为num是从1开始增加的,而target数组第一个元素target[0]是大于等于1的数,我们只需要遍历完target数组即可

    class Solution {
        public List<String> buildArray(int[] target, int n) {
            ArrayList<String> ans=new ArrayList<>();
            if(target==null||target.length==0||n==0)return ans;
            int index=0,num=1;
            while(index<=target.length-1){
                if(target[index]==num){
                    ans.add("Push");
                    num++;
                    index++;
                }else{
                    ans.add("Push");
                    ans.add("Pop");
                    num++;
                }
            }
            return ans;
        }
    }
    

    周赛第二题 5405. 形成两个异或相等数组的三元组数目

    思路

    a==b可以转成ab==0,然后就相当于arr[i]...^arr[k],然后i和k不相等,如果出现成立,j的位置可取可能有k-i

    class Solution {
        public int countTriplets(int[] arr) {
            if(arr==null||arr.length==0)return 0;
            int ans=0;
            for(int i=0;i<arr.length-1;i++){
                int sum=0;
                for(int k=i+1;k<arr.length;k++){               
                    for(int j=i;j<=k;j++){
                        sum^=arr[j];
                    }
                    if(sum==0)ans+=k-i;
                    sum=0;
                }
            }
            return ans;
        }
    }
    

    周赛第三题 5406. 收集树上所有苹果的最少时间

    给你一棵有 n 个节点的无向树,节点编号为 0 到 n-1 ,它们中有一些节点有苹果。通过树上的一条边,需要花费 1 秒钟。你从 节点 0 出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点 0 。无向树的边由 edges 给出,其中 edges[i] = [fromi, toi] ,表示有一条边连接 from 和 toi 。除此以外,还有一个布尔数组 hasApple ,其中 hasApple[i] = true 代表节点 i 有一个苹果,否则,节点 i 没有苹果。

    思路

    很简单的思想,只要有一个节点是苹果,那么我们就让他老爸变苹果然后ans+=2,因为edges数组是根据树层次遍历构造的,且每个节点都在edges[i][1]只出现一次,所以我们逆序遍历,因为叶子节点一定在edges数组的末尾,每遍历到一个节点如果是苹果,我们就将它父亲节点也设成true,然后ans+2,这里可能父亲节点本来就是true,但是我们不管,依旧set。

    class Solution {
        public int minTime(int n, int[][] edges, List<Boolean> hasApple) {
            if(n==0||edges.length==0||hasApple.size()==0)return 0;
            int ans=0;
            for(int i=edges.length-1;i>=0;i--){
                if(hasApple.get(edges[i][1])==true){
                    hasApple.set(edges[i][0],true);
                    ans+=2;
                }
            }
            return ans;
        }
    }
    

    每日一题 236. 二叉树的最近公共祖先

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if(root==null)return null;
            if(root==p||root==q)return (root==p)?p:q;
            TreeNode left=lowestCommonAncestor(root.left,p,q);
            TreeNode right=lowestCommonAncestor(root.right,p,q);
            if(left!=null&&right!=null) return root;
            return (left==null)?right:left;
        }
    }
    
  • 相关阅读:
    HDU4731+找规律
    Unable to open c
    珠宝
    allegro添加多个过孔
    STM32硬件复位时间
    Android 系统的四层结构
    AIDL与stub
    devfs,proc,udev
    cdev[典]
    Linux设备管理之权限倾斜——mem、proc、devfs、sysfs、udev(下)
  • 原文地址:https://www.cnblogs.com/k-will/p/12863107.html
Copyright © 2011-2022 走看看