LeetCode --- 436周赛
题目列表
3446. 按对角线进行矩阵排序
3447. 将元素分配给有约束条件的组
3448. 统计可以被最后一个数位整除的子字符串数目
3449. 最大化游戏分数的最小值
一、按对角线进行矩阵排序

直接模拟,遍历每一个斜对角线,获取斜对角线上的数字,排序后重新赋值即可。
这里教大家一个从右上角往左下角依次遍历斜对角线的方法,对于每一条对角线上的任意元素 g r i d [ i ] [ j ] grid[i][j] grid[i][j],我们会发现 i − j i-j i−j 为一个定值,以 3 × 3 3\times 3 3×3 的矩阵为例,从右上角往左下角 i − j i-j i−j 分别为 − 2 , − 1 , 0 , 1 , 2 -2,-1,0,1,2 −2,−1,0,1,2,只要加上一个偏移量 3 3 3,就会变成 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5
由此可以推导出一个公式,对于一个 n × m n\times m n×m 的矩阵,令 k = m + i − j k=m+i-j k=m+i−j,让 k = 1 , 2 , . . . , n + m − 1 k=1,2,...,n+m-1 k=1,2,...,n+m−1,可以依次遍历每一条斜对角线,其中 i ∈ [ 0 , n − 1 ] , j = m + i − k i\in [0,n-1],j=m+i-k i∈[0,n−1],j=m+i−k
代码如下
// C++
class Solution {
public:vector<vector<int>> sortMatrix(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();// 令 k = m - j + i => j = m - k + i , i = k - m + j// 当 i = 0 时,j = m - k// 当 i = n - 1 时,j = m - k + n - 1for(int k = 1; k < n + m; k++){int min_j = max(m - k, 0); // 注意越界int max_j = min(m - k + n - 1, m - 1); // 注意越界vector<int> res;for(int j = min_j; j <= max_j; j++){res.push_back(grid[k - m + j][j]);}if(min_j > 0) ranges::sort(res);else ranges::sort(res, greater<>());for(int j = min_j; j <= max_j; j++){grid[k - m + j][j] = res[j - min_j];}}return grid;}
};
# Python
class Solution:# k = m + i - j# i = 0, j = m - k# i = n - 1, j = m - k + n - 1def sortMatrix(self, grid: List[List[int]]) -> List[List[int]]:n, m = len(grid), len(grid[0])for k in range(1, n+m):min_j = max(m - k, 0)max_j = min(m - k + n - 1, m - 1)res = [grid[k - m + j][j] for j in range(min_j, max_j + 1)]res.sort(reverse=min_j==0)for j, val in zip(range(min_j, max_j + 1), res):grid[k - m + j][j] = valreturn grid
二、将元素分配给有约束条件的组

我们可以优先计算出 e l e m e n t s elements elements 中数字的倍数情况,存放在 f [ x ] f[x] f[x] 中, f [ x ] = i f[x]=i f[x]=i 表示 x x x 能被 e l e m e n t s [ i ] elements[i] elements[i] 整除,如果有多个 i i i 符合条件,取最左边的那个,然后根据 f [ x ] f[x] f[x] 中的结果给 g r o u p s groups groups 中的数进行赋值即可,具体操作见代码,如下
// C++
class Solution {
public:vector<int> assignElements(vector<int>& groups, vector<int>& elements) {int n = groups.size(), m = elements.size();int mx = ranges::max(groups);vector<int> f(mx + 1, -1);// 时间复杂度分析// 当elements=[1,2,3,...,x]时,达到最坏时间复杂度// mx/1+mx/2+...+mx/x//= mx(1+1/2+1/3+...+1/x)//= mx*log(x)for(int i = 0; i < m; i++){int x = elements[i];if(x > mx || f[x] != -1) continue;for(int j = 1; j < mx/x + 1; j++){if(f[x*j] == -1){f[x*j] = i;}}}vector<int> ans(n);for(int i = 0; i < n; i++){ans[i] = f[groups[i]];}return ans;}
};
# Python
class Solution:def assignElements(self, groups: List[int], elements: List[int]) -> List[int]:mx = max(groups)f = [-1] * (mx + 1)for i, x in enumerate(elements):if x > mx or f[x] != -1:continuefor j in range(x, mx+1, x):if f[j] < 0:f[j] = ireturn [f[x] for x in groups]
三、统计可以被最后一个数位整除的子字符串数目

题目思路:
-
由于最后一位数的取值为 1 1 1~ 9 9 9,我们可以分别统计以这些数为结尾的数字对答案的贡献
-
假设我们计算以 x x x 为结尾的数字对答案的贡献
- 对于前 i i i 个字符组成的数字 S i − 1 S_{i-1} Si−1,加上当前数字 s i s_i si,它的取模结果为 ( S i − 1 × 10 + s i ) % x = ( ( S i − 1 × 10 ) % x + s i ) % x = ( ( S i − 1 % x ) × 10 + s i ) % x (S_{i-1} \times 10 + s_i)\%x=((S_{i-1} \times 10)\%x+s_i)\%x=((S_{i-1}\%x) \times 10+s_i)\%x (Si−1×10+si)%x=((Si−1×10)%x+si)%x=((Si−1%x)×10+si)%x
- 从式子中我们可以看出,我们其实并不需要关心数字 S i − 1 S_{i-1} Si−1 具体是多少,我们只要知道 S i − 1 % x S_{i-1}\%x Si−1%x 的结果即可
- 设 f [ i ] [ j ] f[i][j] f[i][j] 表示数字 S i S_i Si 模 x x x 后结果为 j j j 的所有数字个数
- f [ i ] [ ( j × 10 + s i ) % x ] + f[i][(j\times10+s_i)\%x]\ + f[i][(j×10+si)%x] + = f [ i − 1 ] [ j ] =f[i-1][j] =f[i−1][j], j ∈ [ 0 , x ) j\in[0,x) j∈[0,x), s i s_i si 和前面的 S i − 1 S_{i-1} Si−1 合起来作为一个数
- f [ i ] [ s i % x ] + f[i][s_i\%x]\ + f[i][si%x] + = 1 =1 =1, s i s_i si 单独作为一个数
- 当 s i = x s_i=x si=x 时,将 f [ i ] [ 0 ] f[i][0] f[i][0] 加入答案
代码如下
// C++
class Solution {
using LL = long long;
public:long long countSubstrings(string s) {int n = s.size();LL ans = 0;for(int x = 1; x < 10; x++){vector f(n + 1, vector<LL>(x));for(int i = 0; i < n; i++){int y = s[i] - '0';for(int j = 0; j < x; j++){f[i+1][(j*10+y)%x] += f[i][j];}f[i+1][y%x]++;if(y == x) ans += f[i+1][0];}}return ans;}
};
// 空间优化
class Solution {
using LL = long long;
public:long long countSubstrings(string s) {int n = s.size();LL ans = 0;for(int x = 1; x < 10; x++){vector<LL> f(x);for(int i = 0; i < n; i++){vector<LL> t(x);int y = s[i] - '0';for(int j = 0; j < x; j++){t[(j*10+y)%x] += f[j];}t[y%x]++;f = t;if(y == x) ans += f[0];}}return ans;}
};
# Python
class Solution:def countSubstrings(self, s: str) -> int:n = len(s)ans = 0for x in range(1, 10):f = [0] * xfor y in map(int, s):t = [0] * xfor j in range(x):t[(j*10+y)%x] += f[j]t[y%x] += 1f = tif x == y: ans += f[0]return ans
四、最大化游戏分数的最小值

最大化最小值,显然用二分来做。
- 是否具有单调性?显然具备,因为 g a m e S c o r e m i n gameScore_{min} gameScoremin 越大,则每个下标位 + + + = p o i n t s [ i ] =points[i] =points[i] 的操作次数就会变多,则总操作数就会更容易超过 m m m,故可以用二分
- c h e c k check check 函数如何写?这里有个结论:对于任意一种下标移动顺序,都能变成若干组左右来回横跳的形式。所以我们可以贪心的让左边的下标先满足条件,然后再考虑后面的位置,即我们先考虑通过 0 → 1 、 1 → 0 0 \rightarrow 1、1 \rightarrow 0 0→1、1→0 让 0 0 0 先满足条件,在用 1 → 2 、 2 → 1 1 \rightarrow 2、2 \rightarrow 1 1→2、2→1 让 1 1 1 满足条件,同样的方式让 2 、 3 、 . . . 、 n − 1 2、3、...、n-1 2、3、...、n−1 依次满足条件,看总操作次数是否 > m >m >m
代码如下
// C++
class Solution {
using LL = long long;
public:long long maxScore(vector<int>& points, int m) {int n = points.size();auto check = [&](LL k)->bool{if(k == 0) return true;int s = m, pre = 0; // pre 表示为了解决 i - 1 位置,进行反复横跳之后,对 i 位置已经进行的 += points[i] 操作次数for(int i = 0; i < n; i++){int ops = (k - 1) / points[i] + 1 - pre; // 需要走 ops 次if(i == n - 1 && ops <= 0)break;ops = max(1, ops); // 从 i-1 移动到 i,需要至少 1 次操作s -= 2 * (ops - 1) + 1;if(s < 0) return false;pre = ops - 1;}return true;};// (m + 1)/2 表示只有两个数时,第一个数进行的操作次数,这里我们默认将最小值放在这一位,得到一个上限LL l = 0, r = 1LL * (m + 1) / 2 * ranges::min(points);while(l <= r){LL mid = l + (r - l)/2;if(check(mid)) l = mid + 1;else r = mid - 1;}return r;}
};
# Python
class Solution:def maxScore(self, points: List[int], m: int) -> int:n = len(points)def check(k:int)->int:if k == 0: return Trues = mpre = 0for i, x in enumerate(points):ops = (k - 1) // x + 1 - preif i == n - 1 and ops <= 0:return Trueops = max(ops, 1)s -= 2 * ops - 1if s < 0: return Falsepre = ops - 1return Truel , r = 0, (m + 1) // 2 * min(points)while l <= r:mid = l + (r - l) // 2if check(mid):l = mid + 1else:r = mid - 1return r
相关文章:
LeetCode --- 436周赛
题目列表 3446. 按对角线进行矩阵排序 3447. 将元素分配给有约束条件的组 3448. 统计可以被最后一个数位整除的子字符串数目 3449. 最大化游戏分数的最小值 一、按对角线进行矩阵排序 直接模拟,遍历每一个斜对角线,获取斜对角线上的数字,排…...
用easyExcel如何实现?
要使提供的 ExcelModelListener 类来解析 Excel 文件并实现批量存储数据库的功能,需要结合 EasyExcel 库来读取 Excel 数据。具体来说,可以使用 EasyExcel.read() 方法来读取 Excel 文件,并指定 ExcelModelListener 作为事件监听器。 下面是…...
从 X86 到 ARM :工控机迁移中的核心问题剖析
在工业控制领域,技术的不断演进促使着工控机从 X86 架构向 ARM 架构迁移。然而,这一过程并非一帆风顺,面临着诸多关键挑战。 首先,软件兼容性是一个重要问题。许多基于 X86 架构开发的工业控制软件可能无法直接在 ARM 架构上运行…...
大模型DeepSeek-R1学习
学习路线 机器学习-> 深度学习-> 强化学习-> 深度强化学习 大模型演进分支 微调: SFT 监督学习蒸馏:把大模型作为导师训练小模型RLHF:基于人类反馈的强化学习 PPO 近端策略优化 油门 - 重要性采样 权重 * 打分刹车 - clip 修剪…...
【STM32】H743的以太网MAC控制器的一个特殊功能
调试743的MAC,翻阅手册的时候,发现了一个有意思的功能 混杂模式 H743的MAC控制器,可以设置为混杂模式,这就意味着它可以做一些网络监控的应用,譬如连接具备端口镜像功能的交换机,然后直接代替PC实现网络数据…...
关于“i18n“在vue中的使用
关于"i18n"在vue中的使用 <!-- vue2中 --> <template><div>{{ $t("This campaign has expired.") }}}}</div> </template> <script> export default {created() {this.onLoading();},methods: {onLoading () {this.$…...
前缀树算法篇:前缀信息的巧妙获取
前缀树算法篇:前缀信息的巧妙获取 那么前缀树算法是一个非常常用的算法,那么在介绍我们前缀树具体的原理以及实现上,我们先来说一下我们前缀树所应用的一个场景,那么在一个字符串的数据集合当中,那么我们查询我们某个字…...
DVSI使用SenseGlove为开发虚拟现实场景技能培训
虚拟现实场景技能培训能够有效提升被培训者的技能熟练度,使其在现实世界中经历类似事件时第一时间做出正确反映,从而大大降低因缺乏相关技能经验所造成的财产、人员、时间损失。 DVSI(Digital Voice Systems Inc)是一家美国数字化…...
VSCode + Continue 实现AI编程助理
安装VS Code 直接官网下载安装,反正是免费的。 安装VS插件Continue 直接在插件市场中搜索, Continue,第一个就是了。 配置Chat Model 点击Add Chat model后进行选择: 选择Ollama后,需要点击下面的config file : 由于…...
【PHP的static】
关于静态属性 最简单直接:静态方法也是一样 看了很多关于静态和动态的说法,无非是从 调用方式, 类访问实例变量, 访问静态变量, 需不要实例化这几个方向,太空了。问使用场景,好一点的 能说个…...
考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)
目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统: 操作系统是指控制和管理整个计算机系统的软硬件资源&…...
从360度全景照片到高质量3D场景:介绍SC-Omnigs 3D重建系统
在当今的数字化时代,3D重建技术正在迅速发展,并广泛应用于文旅、空间智能和3D重建等领域。为了简化360度全景相机拍摄数据的处理流程,提高3D场景重建的质量和效率,我们开发了一款专门处理360度全景相机数据的3D重建系统——SC-Omnigs。本文将详细介绍这一系统的功能、特点及…...
前沿技术新趋势:值得关注的创新发展
量子通信是一种新兴的通信技术。它基于量子力学的原理,特别是量子叠加和量子纠缠。量子通信的核心在于量子比特qubits),与传统的比特不同,量子比特可以同时处于多种状态。这种特性使得信息的传输更为安全。 量子通信技术的最大优…...
算法跟练第十一弹——二叉树
文章目录 part01 递归遍历1.1 二叉树的前序遍历1.2 二叉树的中序遍历1.3 二叉树的后序遍历 part02 迭代遍历2.1 二叉树的前序遍历2.2 二叉树的中序遍历2.3 二叉树的后序遍历 part03 层序遍历3.1 二叉树的层序遍历3.2 二叉树的层序遍历II3.3 二叉树的右视图 归纳获取双重链表的第…...
机器学习(李宏毅)——BERT
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention、Transformer,可参阅我其他文章。 二、大纲 BERT简介self-…...
新数据结构(7)——Object
Object类是所有类的父类,在 Java 中,每个类都直接或间接地继承自Object类,也就是说所有类都是object类的子类可以使用Object里的方法。 equals()和hashCode()是Java中Object类所包含的两个关键方法,下面将介绍两个方法。 和equa…...
云计算基础
环境准备 配置虚拟机安装docker 前提安装 步骤命令效果图 安装docker-compose 前提安装 步骤效果图 安装gitea 步骤命令效果图 执行docker-compose命令浏览器初始gitea配置浏览器登录gitea创建组织创建仓库 Drone安装 步骤效果图 非自动化部署 nginx安装redis安装jdk安装…...
利用kali linux 进行自动化渗透测试
本方案旨在自动化创建渗透测试全流程 一、架构 1.智能信息收集体系 class IntelligentOSINT:def __init__(self, target):self.target targetself.intelligence_sources [OSINT_Platforms,DeepWeb_Crawlers, SocialMedia_Trackers,ML_Correlation_Engine]def advanced_col…...
【Vue中BUG解决】npm error path git
报错内容如下: 从错误信息可知,这是一个 ENOENT(No Entry,即找不到文件或目录)错误,并且与 git 相关。具体来说,npm 在尝试调用 git 时,无法找到 git 可执行文件,下面为…...
GPT-4o微调SFT及强化学习DPO数据集构建
假设,已经标注的训练数据集df包含了提示词、输入和输出三列。 构建微调SFT的数据集代码如下: data [] for x in df.values:prompt x[1]user_content x[2]assistant_content x[3]data.append({"messages": [{"role": "sys…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
