力扣周赛:第419场周赛

👨‍🎓作者简介:爱好技术和算法的研究生
🌌上期文章:力扣周赛:第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.rhkb.cn/news/446125.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——传输层协议

目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…

Leecode刷题之路第18天之四数之和

题目出处 18-四数之和-题目出处 题目描述 个人解法 思路&#xff1a; todo 代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo 官方解法 18-四数之和-官方解法 方法1&#xff1a;排序双指针 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java…

codeforces round976 div2

A find minimum operations 思路&#xff1a;将所给的n变成k进制数&#xff0c;答案就是n的k进制形式下的位数之和 代码&#xff1a; #include <bits/stdc.h> using namespace std;typedef long long ll;ll n, k;void solve() {cin >> n >> k;ll cnt 0…

陪诊小程序搭建:打造便利的陪诊环境

陪诊行业作为一个新兴行业&#xff0c;随着老龄化的严重&#xff0c;在近几年中需求量日益旺盛。陪诊师为大众的就医提供了极大的便利性&#xff0c;在看病难、医疗资源紧张方面发挥了积极作用。 在陪诊行业的快速发展下&#xff0c;陪诊小程序为行业带来了便捷的模式&#xf…

解决:gpg: 从公钥服务器接收失败:服务器故障

当你添加密钥时报错&#xff0c;可以按照下面的步骤&#xff0c;依次输入。 # 停止 Network Manager 服务 sudo service network-manager stop# 删除 Network Manager 的状态文件 sudo rm /var/lib/NetworkManager/NetworkManager.state# 重新启动 Network Manager 服务 sudo …

TCP IP网络编程

文章目录 TCP IP网络编程一、基础知识&#xff08;TCP&#xff09;1&#xff09;Linux1. socket()2.bind()2.1前提2.2字节序与网络字节序2.3 字节序转换2.4 字符串信息转化成网络字节序的整数型2.5 INADDR_ANY 3.listen()4.accept()5.connect()6.案例小结6.1服务器端6.2 客户端…

Idea不能创建java8切换路径

顶部的Server URL改成https://start.aliyun.com/

【原创】可用于 Android Studio 的翻译插件

在不少讲解Android 开发的老师视频中会出现一个运行在Android Studio 上的翻译插件&#xff0c;感觉挺实用的。 接下来&#xff0c;我们把它安装在我们的Android Studio 上。 设置 点击右上角齿轮按钮&#xff0c;选择Settings 安装 翻译插件 输入Tanslation&#xff0c;选…

ZStack ZROP首个商用版本发布,打造云的可持续发展框架

经过长时间的研发和测试&#xff0c;ZStack ZROP IT服务中台V4.2.0版本正式发布。ZROP 是针对ZStack全系列产品运营、运维、一体化的自研平台。作为第一个商用版本&#xff0c;ZROP V4.2.0支持包含ZStack Cloud、ZStack Cube、ZStack ZStone、ZStack Zaku、ZStack Edge、ZStack…

针对考研的C语言学习(循环队列-链表版本以及2019循环队列大题)

题目 【注】此版本严格按照数字版循环队列的写法&#xff0c;rear所代表的永远是空数据 图解 1.初始化部分和插入部分 2出队 3.分部代码解析 初始化 void init_cir_link_que(CirLinkQue& q) {q.rear q.front (LinkList)malloc(sizeof(LNode));q.front->next NULL…

C++的随机数操作

首先想到的肯定是rand()函数&#xff0c;但是这个有点问题 引入头文件<stdlib.h> 如果不引入种子&#xff0c;它的随机数不是随机数&#xff0c;是固定的一串数字 srand()函数&#xff0c;产生随机的种子 示例&#xff1a; 产生0-99的随机数 #include<stdlib.h&g…

QD1-P5 HTML 段落标签(p)换行标签(br)

本节视频 www.bilibili.com/video/BV1n64y1U7oj?p5 ‍ 本节学习 HTML 标签&#xff1a; p标签 段落br标签 换行 ‍ 一、p 标签-段落 1.1 使用 p 标签划分段落 <p>段落文本</p>示例 <!DOCTYPE html> <html><head><meta charset"…

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…

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

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

GO网络编程(五):海量用户通信系统3:整体框架与C/S通信总体流程【重要】

这个系统其实是尚硅谷的老韩讲的&#xff08;尚硅谷网络编程项目&#xff09;&#xff0c;但是他讲得很碎片化&#xff0c;思路不够清晰&#xff0c;时间又长&#xff0c;所以要掌握还是挺难的。如果你听了他的视频&#xff0c;不去梳理系统业务流程&#xff0c;不去看代码就往…

专题十一_递归_回溯_剪枝_综合练习_算法专题详细总结

目录 1. 找出所有⼦集的异或总和再求和&#xff08;easy&#xff09; 解析&#xff1a; 方法一&#xff1a; 解法二&#xff1a; 总结&#xff1a; 2. 全排列 Ⅱ&#xff08;medium&#xff09; 解析&#xff1a; 解法一&#xff1a;只关心“不合法”的分支 解法二&…

关于Linux下C++程序内存dump的分析和工具

前言 程序崩溃令人很崩溃&#xff0c;特别是让人找不到原因的崩溃&#xff0c;但是合适的工具可以帮助人很快的定位到问题&#xff0c;在AI基础能力ASR服务开发时&#xff0c;找到了一种比较实用和简单的内存崩溃的dump分析工具breakpad&#xff0c; 可以帮助在Linux下C开发程…

QD1-P8 HTML 格式化标签(font、pre、b、strong、i、u、del、s、sub、sup)

本节学习&#xff1a;HTML 格式化标签。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p8 ‍ 一、font 标签 用途&#xff1a;定义文本的字体大小、颜色和 face&#xff08;字体类型&#xff09;。 示例 <!DOCTYPE html> <html><head><meta cha…