LeetCode第188周 周赛

Posted k-will

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
}





以上是关于LeetCode第188周 周赛的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode #188场周赛题解

LeetCode #188场周赛题解

LeetCode周赛

我也是LeetCode周赛“三道题选手”啦 第270场周赛

LeetCode 第63场双周赛复盘

LeetCode周赛252场:时隔半年再来练习