力扣周赛:第419场周赛

news2024/11/25 8:16:02

👨‍🎓作者简介:爱好技术和算法的研究生
🌌上期文章:力扣周赛:第415场周赛
📚订阅专栏:力扣周赛
希望文章对你们有所帮助

因为一些特殊原因,这场比赛就打了1h,所以只AC了前面两题。第三题后面补题自己AC了,第三个居然是个hard题,居然暴力+记忆化就AC了。第四题不会做,面试机试也不会考这么难的,第四题就不补了。

力扣周赛:第419场周赛

  • 计算子数组的 x-sum I
  • 第 K 大的完美二叉子树的大小
  • 统计能获胜的出招序列数

计算子数组的 x-sum I

题目描述
给你一个由 n 个整数组成的数组 nums,以及两个整数 k 和 x。

数组的 x-sum 计算按照以下步骤进行:

统计数组中所有元素的出现次数。
仅保留出现次数最多的前 x 个元素的每次出现。如果两个元素的出现次数相同,则数值 较大 的元素被认为出现次数更多。
计算结果数组的和。
注意,如果数组中的不同元素少于 x 个,则其 x-sum 是数组的元素总和。

返回一个长度为 n - k + 1 的整数数组 answer,其中 answer[i] 是 子数组 nums[i..i + k - 1] 的 x-sum。

子数组 是数组内的一个连续 非空 的元素序列。

示例1
输入:nums = [1,1,2,2,3,4,2,3], k = 6, x = 2

输出:[6,10,12]

解释:

对于子数组 [1, 1, 2, 2, 3, 4],只保留元素 1 和 2。因此,answer[0] = 1 + 1 + 2 + 2。
对于子数组 [1, 2, 2, 3, 4, 2],只保留元素 2 和 4。因此,answer[1] = 2 + 2 + 2 + 4。注意 4 被保留是因为其数值大于出现其他出现次数相同的元素(3 和 1)。
对于子数组 [2, 2, 3, 4, 2, 3],只保留元素 2 和 3。因此,answer[2] = 2 + 2 + 2 + 3 + 3。

示例2
输入:nums = [3,8,7,8,7,5], k = 2, x = 2

输出:[11,15,15,15,12]

解释:

由于 k == x,answer[i] 等于子数组 nums[i…i + k - 1] 的总和。

提示

  • 1 <= n == nums.length <= 50
  • 1 <= nums[i] <= 50
  • 1 <= x <= k <= nums.length

这种数据量直接暴力就行了,在循环中用数组来记录子数组中各个元素的出现次数。

class Solution {
    public int[] findXSum(int[] nums, int k, int x) {
        int n = nums.length, pos = 0;
        int[] ans = new int[n - k + 1];
        for(int i = 0; i <= n - k; ++i){
            int[] count1 = new int[55];
            int[] count2 = new int[55];
            int[] vis = new int[55];
            int sum = 0;
            for(int j = i; j < i + k; ++j){
                count1[nums[j]]++; count2[nums[j]]++;
            }
            Arrays.sort(count1);
            for(int j = 0; j < x; ++j){
                int count = count1[54 - j];
                //System.out.println(count);
                for(int l = 50; l >= 1; --l){
                    if(count2[l] == count && vis[l] == 0){
                        vis[l] = 1;
                        sum += l * count;
                        break;
                    }
                }
            }
            ans[pos++] = sum;
        }
        return ans;
    }
}

第 K 大的完美二叉子树的大小

题目描述
给你一棵 二叉树 的根节点 root 和一个整数k。

返回第 k 大的 完美二叉
子树
的大小,如果不存在则返回 -1。

完美二叉树 是指所有叶子节点都在同一层级的树,且每个父节点恰有两个子节点。

子树 是指树中的某一个节点及其所有后代形成的树。

示例1
输入: root = [5,3,6,5,2,5,7,1,8,null,null,6,8], k = 2

输出: 3

解释:
在这里插入图片描述
完美二叉子树的根节点在图中以黑色突出显示。它们的大小按降序排列为 [3, 3, 1, 1, 1, 1, 1, 1]
第 2 大的完美二叉子树的大小是 3。

示例2
输入: root = [1,2,3,4,5,6,7], k = 1

输出: 7

解释:
在这里插入图片描述
完美二叉子树的大小按降序排列为 [7, 3, 3, 1, 1, 1, 1]。最大的完美二叉子树的大小是 7。

示例3
输入: root = [1,2,3,null,4], k = 3

输出: -1

解释:
在这里插入图片描述
完美二叉子树的大小按降序排列为 [1, 1]。完美二叉子树的数量少于 3。

提示

  • 树中的节点数目在 [1, 2000] 范围内。
  • 1 <= Node.val <= 2000
  • 1 <= k <= 1024

显然就是个dfs题,另外可以发现,只要是一个完美二叉树,那么它的节点数量为2^h - 1,其中h为树高,所以我们只需要dfs并且维护这个树高,最后对树高从大到小进行排序后计算即可。
需要考虑的点是,不符合完美二叉树的那些情况,有如下2点情况:
(1)左右子树中有任意一个子树不是完美二叉树。
(2)左右子树虽然都是完美二叉树,但是树高不同。
所以思路很明确,我们只需要用一个可变长度的数组来记录完美二叉树的树高,并且递归遍历,如果不符合完美二叉树则直接返回-1。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int kthLargestPerfectSubtree(TreeNode root, int k) {
        List<Integer> h = new ArrayList<>();
        dfs(root, h);
        if(k > h.size()){
            return -1;
        }
        Collections.sort(h, (o1, o2) -> o2.compareTo(o1));//用了lambda表达式
        //System.out.println(h);
        return (1 << h.get(k - 1)) - 1;
    }
    public int dfs(TreeNode root, List<Integer> h){
        if(root == null){
            return 0;
        }
        int l = dfs(root.left, h), r = dfs(root.right, h);
        if(l == -1 || r == -1 || l != r){
        	//左右子树中存在非完美二叉树,或者左右的完美二叉树的树高不同,那么以该结点为父节点的树就不是完美二叉树
            return -1;
        }
        h.add(l + 1);//是完美二叉树就记录树高
        return l + 1;
    }
}

统计能获胜的出招序列数

题目描述
Alice 和 Bob 正在玩一个幻想战斗游戏,游戏共有 n 回合,每回合双方各自都会召唤一个魔法生物:火龙(F)、水蛇(W)或地精(E)。每回合中,双方 同时 召唤魔法生物,并根据以下规则得分:

  • 如果一方召唤火龙而另一方召唤地精,召唤 火龙 的玩家将获得一分。

  • 如果一方召唤水蛇而另一方召唤火龙,召唤 水蛇 的玩家将获得一分。

  • 如果一方召唤地精而另一方召唤水蛇,召唤 地精 的玩家将获得一分。

  • 如果双方召唤相同的生物,那么两个玩家都不会获得分数。
    给你一个字符串 s,包含 n 个字符 ‘F’、‘W’ 和 ‘E’,代表 Alice 每回合召唤的生物序列:

  • 如果 s[i] == ‘F’,Alice 召唤火龙。

  • 如果 s[i] == ‘W’,Alice 召唤水蛇。

  • 如果 s[i] == ‘E’,Alice 召唤地精。

Bob 的出招序列未知,但保证 Bob 不会在连续两个回合中召唤相同的生物。如果在 n 轮后 Bob 获得的总分 严格大于 Alice 的总分,则 Bob 战胜 Alice。

返回 Bob 可以用来战胜 Alice 的不同出招序列的数量。

由于答案可能非常大,请返回答案对 10^9 + 7 取余 后的结果。
示例1
输入: s = “FFF”

输出: 3

解释:
Bob 可以通过以下 3 种出招序列战胜 Alice:“WFW”、“FWF” 或 “WEW”。注意,其他如 “WWE” 或 “EWW” 的出招序列是无效的,因为 Bob 不能在连续两个回合中使用相同的生物。

示例2
输入: s = “FWEFW”

输出: 18

解释:
Bob 可以通过以下出招序列战胜 Alice:“FWFWF”、“FWFWE”、“FWEFE”、“FWEWE”、“FEFWF”、“FEFWE”、“FEFEW”、“FEWFE”、“WFEFE”、“WFEWE”、“WEFWF”、“WEFWE”、“WEFEF”、“WEFEW”、“WEWFW”、“WEWFE”、“EWFWE” 或 “EWEWE”。

提示

  • 1 <= s.length <= 1000
  • s[i] 是 ‘F’、‘W’ 或 ‘E’ 中的一个。

这道题居然能是hard,难以想象,整得我还以为这题这题肯定是要DP优化的,结果数据量这么小的。不过需要注意的是f数组不要开始就定义,不然可能会爆了。
f[i][j][k]表示当前位置为i,Alice选用的魔法生物是j(0<=j<3)且此时的分差为k的时候,Bob赢Alice的方案数,但是需要注意的是,这个k可能是负数,所以记录的时候要小心,使用f[i][j][k + len],防止数组越界。

class Solution {
    int[][][] f;
    public int countWinningSequences(String s) {
        int len = s.length();
        f = new int[len][3][2 * len + 1];
        for(int i = 0; i < len; ++i){
            for(int j = 0; j < 3; ++j){
                Arrays.fill(f[i][j], -1);
            }
        }
        return dfs(s, -1, -1, 0, len);
    }
    public int dfs(String s, int i, int j, int k, int len){
        if(k < 0 && (len - i) < -1 * k) return 0;
        if(i >= 0 && f[i][j][k + len] != -1) return f[i][j][k + len];
        if(i == len - 1){
            return k > 0 ? 1 : 0;
        }
        int res = 0;
        for(int x = 0; x < 3; ++x){
            if(x != j){
                int sc = calculate(s, i + 1, x);
                res = (res + dfs(s, i + 1, x, k + sc, len)) % (int)(1e9 + 7);
            }
        }
        if(i > 0){
            f[i][j][k + len] = res;
        }
        return res;
    }
    public int calculate(String s, int i, int x){
        char c = s.charAt(i);
        if(c == 'F' && x == 0 || c == 'W' && x == 1 || c == 'E' && x == 2)return 0;
        if(c == 'F' && x == 1 || c == 'W' && x == 2 || c == 'E' && x == 0)return 1;
        return -1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Linux] Linux 模拟实现 Shell

标题&#xff1a;[Linux] Linux 模拟实现 Shell 个人主页水墨不写bug&#xff08;图片来源于网络&#xff09; 目录 一、什么是shell 二、shell的理解 三、模拟实现shell 1&#xff09;打印命令行提示 2&#xff09;获取用户的输入字符串 3&#xff09;分割命令字符串 4…

【优选算法篇】双指针的优雅舞步:C++ 算法世界的浪漫探索

文章目录 C 双指针详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;对撞指针1.1 移动零解题思路图解分析C代码实现易错点提示代码解读 1.2 复写零解题思路算法步骤C代码实现易错点提示代码复杂度 1.3 盛最多水的容器1. 题目链接2. 题目描述解法一&#xff08;暴力求解…

链表(4)_合并K个升序链表_面试题

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 链表(4)_合并K个升序链表_面试题 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录…

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

Egg考古系列-EggCore的生命周期

关于EGG egg框架的第一个版本还是2017-03-21&#xff0c;距今已有7年了。虽然最近几年没有什么更新&#xff0c;但它在国内的使用还是挺多的&#xff0c;mvc的分层模式也很受大家喜欢。虽然声称是面向企业级、中大型项目场景的框架&#xff0c;但这种约定式在大型项目中其实也很…

高校学科竞赛管理:SpringBoot实现的高效策略

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【M2-Mixer】核心方法解读

abstract&#xff1a; 在本文中&#xff0c;我们提出了M2-Mixer&#xff0c;这是一种基于MLPMixer的结构&#xff0c;具有多头损失&#xff0c;用于多模态分类。它比基于卷积、循环或神经结构搜索的基线模型具有更好的性能&#xff0c;其主要优势是概念和计算简单。所提出的多…

【电子电力】LCL滤波器设计,包括电流控制调谐

摘要 LCL 滤波器是电力电子领域中广泛应用于并网逆变器的滤波器之一&#xff0c;其主要功能是减少高频开关的谐波&#xff0c;确保输出电流的质量。本文设计并实现了基于 MATLAB 的 LCL 滤波器模型&#xff0c;结合电流控制器和调谐技术&#xff0c;验证了其在谐波抑制方面的效…

从RNN讲起(RNN、LSTM、GRU、BiGRU)——序列数据处理网络

文章目录 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;1. 什么是RNN&#xff1f;2. 经典RNN的结构3. RNN的主要特点4. RNN存在问题——长期依赖&#xff08;Long-TermDependencies&#xff09;问题 LSTM&#xff08;Long Short-Term Memory&a…

PostgreSQL学习笔记七:常规SQL操作

PostgreSQL 支持标准的 SQL 语句&#xff0c;同时也扩展了一些特有的功能。以下是一些常规的 SQL 语句示例&#xff0c;这些示例涵盖了数据定义、数据操作和数据查询的基本操作&#xff1a; 数据定义语言 (DDL 创建数据库&#xff1a; CREATE DATABASE mydatabase;创建表&#…

stm32单片机个人学习笔记9(TIM输入捕获)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

AWD入门

一、简介 AWD(Attack With Defense&#xff0c;攻防兼备)模式。你需要在一场比赛里要扮演攻击方和防守方&#xff0c;攻者得分&#xff0c;失守者会被扣分。也就是说攻击别人的靶机可以获取 Flag 分数时&#xff0c;别人会被扣分&#xff0c;同时你也要保护自己的主机不被别人…

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题&#xff0c;基本不能用了&#xff0c;后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如…

Python网络爬虫入门指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

2024年网络安全进阶学习路径-2024年进阶学习指南

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…

KDD 2024论文分享┆用于序列推荐的数据集再生

论文简介 本推文介绍了2024 KDD的最佳学生论文《Dataset Regeneration for Sequential Recommendation》。该论文提出了一种基于数据中心化范式的新框架&#xff0c;称为DR4SR&#xff0c;该框架通过模型无关的数据再生机制&#xff0c;能够生成具有出色跨架构泛化能力的理想训…

git(版本回退,分支管理,vscode集成git)

一、安装与简单命令 1.官网 https://git-scm.com/downloads 2.查看版本号git --version 3.设置用户签名&#xff08;用户名和邮箱&#xff09; 用来标识用户&#xff0c;以区分不同的开发人员 git config --global user.name "Your Name" git config --global u…

2024年最新算法:青蒿素优化算法(Artemisinin Optimization Algorithm, AOA)原理介绍

青蒿素优化算法&#xff08;Artemisinin Optimization Algorithm, AOA&#xff09;是2024年提出的一种受青蒿素抗疟疾特性启发的元启发式优化算法。青蒿素是一种从中草药青蒿中提取的化合物&#xff0c;因其在治疗疟疾方面的显著效果而闻名。AOA算法的设计者将青蒿素的这一特性…