Leetcode 第 138 场双周赛题解

news/2024/9/18 12:06:18/ 标签: LeetCode, 数据结构与算法, C++

Leetcode 第 138 场双周赛题解

  • Leetcode 第 138 场双周赛题解
    • 题目1:3270. 求出数字答案
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3271. 哈希分割字符串
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3272. 统计好整数的数目
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3273. 对 Bob 造成的最少伤害
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 138 场双周赛题解

题目1:3270. 求出数字答案

思路

按题意模拟。

代码

/** @lc app=leetcode.cn id=3270 lang=cpp** [3270] 求出数字答案*/// @lc code=start
class Solution
{
public:int generateKey(int num1, int num2, int num3){string s1 = trans(num1);string s2 = trans(num2);string s3 = trans(num3);string s = "";for (int i = 0; i < 4; i++)s += min(s1[i], min(s2[i], s3[i]));return stoi(s);}// 辅函数string trans(int x){string s = to_string(x);int n = s.length();for (int i = 0; i < 4 - n; i++)s.insert(s.begin(), '0');return s;}
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目2:3271. 哈希分割字符串

思路

按题意模拟。

代码

/** @lc app=leetcode.cn id=3271 lang=cpp** [3271] 哈希分割字符串*/// @lc code=start
class Solution
{
public:string stringHash(string s, int k){int n = s.length();string result;for (int i = 0; i < n / k; i++){int sum = 0;for (int j = 0; j < k; j++)sum += s[i * k + j] - 'a';int hashedChar = sum % 26;result.push_back(hashedChar + 'a');}return result;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 s 的长度。

空间复杂度:O(1),返回值不计入。

题目3:3272. 统计好整数的数目

思路

枚举所有长为 n 的回文数的左半边。

如果回文数 x 能被 k 整除,那么接下来需要解决的问题有两个:

  1. 计算 x 有多少个不同的排列。
  2. 不能重复统计。

统计 s 中的每个数字的出现次数 cnt。

先填最高位。由于不能有前导零,最高位可以填的数有 n−cnt0 个。其余 n−1 个数随便排,有 (n−1)! 种方案。

当然,这里面有重复的,例如 x=34543,其中两个 3 和两个 4 的排列就是重复的,由于这两个 3 无法区分,两个 4 无法区分,方案数要除以 2!2!。

代码

/** @lc app=leetcode.cn id=3272 lang=cpp** [3272] 统计好整数的数目*/// @lc code=start
class Solution
{
private:vector<int> factorial;void init(int n){factorial.assign(n + 1, 0);factorial[0] = 1;for (int i = 1; i <= n; i++){factorial[i] = factorial[i - 1] * i;}}public:long long countGoodIntegers(int n, int k){init(n);long long ans = 0;unordered_set<string> vis;int base = pow(10, (n - 1) / 2);for (int i = base; i < base * 10; i++){ // 枚举回文数左半边string s = to_string(i);s += string(s.rbegin() + (n % 2), s.rend());if (stoll(s) % k){ // 回文数不能被 k 整除continue;}ranges::sort(s);if (!vis.insert(s).second){ // 不能重复统计continue;}int cnt[10]{};for (char c : s){cnt[c - '0']++;}int res = (n - cnt[0]) * factorial[n - 1];for (int c : cnt){res /= factorial[c];}ans += res;}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(10m * nlogn),其中 m = (n-1)/2。

空间复杂度:O(10m * n),其中 m = (n-1)/2。

题目4:3273. 对 Bob 造成的最少伤害

思路

贪心。

首先,一直攻击同一个敌人,相比来回攻击多个敌人(雨露均沾)更好,因为这样我们被敌人攻击的次数更少。

从特殊到一般,想一想,如果只有两个敌人 A 和 B,我们应该先攻击谁?

消灭 A 需要攻击的次数为 kA = ceil(healthA / power),同理可得消灭 B 需要的攻击次数,记作 kB

如果先消灭 A,再消灭 B,那么受到的伤害总和为 kA * damageA + (kA + kB) * damageB;如果先消灭 B,再消灭 A,那么受到的伤害总和为 kB * damageB + (kA + kB) * damageA

如果先消灭 A,再消灭 B 更好,那么有 kA * damageA + (kA + kB) * damageB < kB * damageB + (kA + kB) * damageA,化简得 kA * damageB < kB * damageA

推广到更多的敌人,可以按照上式对 damage 和 health 排序,理由如下。

先假定按照输入的顺序消灭敌人。如果发现相邻两个敌人不满足上面的不等式,就交换这两个敌人的位置,这可以让受到的总伤害变小。

不断交换敌人,直到所有相邻敌人都满足上面的不等式。

本质上来说,这个不断交换相邻敌人的过程,和冒泡排序是一样的。那么按照不等式对数组排序即可。

排序后,按照顺序消灭敌人。用一个变量 s 维护从一开始到击败当前敌人,所经过的秒数。把 s * damage[i] 加入答案。

代码

/** @lc app=leetcode.cn id=3273 lang=cpp** [3273] 对 Bob 造成的最少伤害*/// @lc code=start
class Solution
{
public:long long minDamage(int power, vector<int> &damage, vector<int> &health){int n = damage.size();vector<pair<int, int>> comb(n);for (int i = 0; i < n; i++){int k = ceil(1.0 * health[i] / power);comb[i] = make_pair(k, damage[i]);}sort(comb.begin(), comb.end(),[&](const pair<int, int> &p1, const pair<int, int> &p2){ return p1.first * p2.second < p2.first * p1.second; });long long ans = 0LL;long long s = 0LL;for (auto &[k, d] : comb){s += k;ans += s * d;}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogn),其中 n 是数组 damage 的长度。

空间复杂度:O(n),其中 n 是数组 damage 的长度。


http://www.ppmy.cn/news/1524704.html

相关文章

通过TensorBoard查看服务器训练过程

步骤 1: 启动服务器上的 TensorBoard 在服务器上&#xff0c;启动 TensorBoard 并指定一个端口&#xff08;例如 6006&#xff09;&#xff1a; tensorboard --logdir <日志文件路径> --port 6006这里 <日志文件路径> 是你存放训练日志的目录。 步骤 2: 使用 SS…

无人机巡检:突破传统局限,引领智能监测新时代

无人机行业正在经历快速发展&#xff0c;技术不断创新&#xff0c;应用领域不断拓展。从最初的航拍娱乐到如今的工业巡检、农业植保、物流配送、灾害救援等&#xff0c;无人机正展现出巨大的实用价值。如今&#xff0c;行业级无人机应用不断扩展&#xff0c;在测绘与泛测绘领域…

Redis 事务的实现详解

引言 Redis 作为一个高性能的键值存储数据库&#xff0c;除了其基本的增删查改操作&#xff0c;还提供了事务&#xff08;Transaction&#xff09;功能&#xff0c;以确保多条命令的原子性执行。在某些场景下&#xff0c;我们需要保证多条命令要么全部成功执行&#xff0c;要么…

【AIGC】对AI编程常用的工具提供简要介绍和应用场景

&#x1f3c6;&#x1f3c6;欢迎大家来到我们的天空&#x1f3c6;&#x1f3c6; &#x1f3c6;&#x1f3c6;如果文章内容对您有所触动&#xff0c;别忘了点赞、关注&#xff0c;收藏&#xff01; &#x1f3c6; 作者简介&#xff1a;我们的天空 &#x1f3c6;《头衔》&#x…

数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储

文章目录 栈的应用1.栈的括号匹配代码实战:问题分析:2.栈的表达式求值2.1 中缀、后缀、前缀表达式2.2 中缀表达式改写为后缀表达式(手算)2.3 后缀表达式的计算(手算)2.4 中缀表达式转前缀表达式&#xff08;手算)和计算前缀表达式2.5后缀表达式的计算(机算)2.6 中缀表达式转后缀…

python轻量级异步定时任务

先看一段代码&#xff1a; from apscheduler.schedulers.background import BackgroundScheduler import time import logging# 设置日志记录器 logging.basicConfig() logging.getLogger(apscheduler).setLevel(logging.DEBUG)def job_function():print("This is a sche…

LeetCode:240. 搜索二维矩阵 II,直接查找,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/search-a-2d-matrix-ii/ 解题思路&#xff1a; 不考虑矩阵的排序特性&#xff0c;直接搜索整个矩阵&#xff0c;查找是否存在等于target的元素即可 /*** param {number[][]} matrix* param {number} target* return {boo…

springboot服务器文件读取工具类

本地文件和网络文件读取 一. SpringBoot的RestTemplate配置 RestTemplate 二. 文件读取 RangeEntity 分片下载的封装对象 package com.zzc.component.download;import com.zzc.common.utils.StrUtils; import lombok.Data;import javax.servlet.http.HttpServletResponse;…

微信小程序-文件下载

整体思路&#xff1a; wx.getSetting&#xff1a;获取用户授权。 wx.downloadFile&#xff1a;下载文件资源到本地&#xff0c;客户端直接发起一个 HTTPS GET 请求&#xff0c;返回文件的本地临时路径 (本地路径)&#xff0c;单次下载允许的最大文件为 200MB。 wx.saveImageTo…

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

【HCIA】笔记汇总

IP路由基础 路由表: 分为三种: IP路由表/全局路由表/核心路由表。(RIB表)(指导部分协议报文)记录着目的网络、掩码、出接口、下一跳通过静态、直连、动态路由协议生成的。比如说三台设备相连,其中直连设备会直接生成路由表项。其它的路由表项根据优先级和开销值来选举,…

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序(C语言)

【应用笔记】Cot Menu 轻量级多级菜单控制框架程序&#xff08;C语言&#xff09; 前言: 工作需要, 实现一个串口打印的类shell菜单. 如果按照以往的习惯我会自己重新"构思"(狗屎)一个菜单框架.之前用oled和lcd时,我都从零重复造轮子. 作为一个成熟的程序员, 应该要学…

【大数据算法】一文掌握大数据算法之:空间亚线性算法。

空间亚线性算法 1、空间亚线性算法1.1 定义1.2 核心原理1.2.1 数据流模型1.2.2 随机化技术1.2.3 哈希技术 1.3 应用场景1.4 算法公式1.5 代码示例 2、总结 1、空间亚线性算法 1.1 定义 空间亚线性算法是指在处理大数据时&#xff0c;其所需的空间复杂度小于输入数据规模的线性…

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中&#xff0c;如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹&#xff08;即该文件夹内没有任何文件或子文件夹&#xff09;&#xff0c;你可以使用rmdir命令。但是&#xff0c;如果mysql-8.0.31文件夹并非完全为空&#xff08;即它包含文件或子文件夹&#xf…

创建一个Oracle版本的JDK的Docker镜像

背景说明 OpenJDK 和Oracle JDK 一般情况下我们选择OpenJDK&#xff0c;两者针对大部分场景都可以满足&#xff0c;有些地方例如反射技术获得某些包路径下的类对象等&#xff0c;有时候选择OpenJDK会导致空指针异常。 两者在底层实现方面有部分区别。 创建镜像 这里是Linux…

学生请假管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生请假管理系统拥有两种角色 管理员&#xff1a;班级管理、课程管理、学生管理、审核请假信息、导出请假单 学生&#xff1a;填写请假单、查看请假审核情况 1.1 背景描述 学生请假管…

centos/kali 操作不同(两处)

二进制包安装 centos7&#xff1a; rpm包 rpm -ivhkali: deban包 dpkg -i deb包 网络镜像源配置 centos7&#xff1a; 配置文件路径 /etc/yum.repos.d 配置镜像源&#xff0c;会生成 .repo为后缀的文件&#xff0c;文件内容格式&#xff1a; [后缀.repo四部----------------…

bug是什么意思

“Bug” 是指计算机程序或系统中的错误或缺陷&#xff0c;导致程序运行时产生意外行为、结果不正确或崩溃。 Bug的来源 “Bug”一词源于1940年代&#xff0c;当时的计算机是大型机械设备&#xff0c;某些问题是由于昆虫&#xff08;Bug&#xff09;进入机器导致的故障。虽然这…

讨论:无法访问不同网段的Kafka问题

问题 X同学&#xff1a;A网段的机器&#xff0c;访问B网段部署的Kafka集群&#xff0c;中间做了网络映射&#xff0c;映射成A网段可以访问的IP地址&#xff0c;A网段程序里配置bootstrap.servers就是这些可以访问的地址。但是最后发现还是无法访问&#xff0c;并且日志里看到了…

Golang | Leetcode Golang题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; func isSubsequence(s string, t string) bool {n, m : len(s), len(t)f : make([][26]int, m 1)for i : 0; i < 26; i {f[m][i] m}for i : m - 1; i > 0; i-- {for j : 0; j < 26; j {if t[i] byte(j a) {f[i][j] i} else {…