LeetCode 每日一题 Day 202-209

2663. 字典序最小的美丽字符串(Hard)

如果一个字符串满足以下条件,则称其为 美丽字符串 :

它由英语小写字母表的前 k 个字母组成。
它不包含任何长度为 2 或更长的回文子字符串。
给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。

请你找出并返回一个长度为 n 的美丽字符串,该字符串还满足:在字典序大于 s 的所有美丽字符串中字典序最小。如果不存在这样的字符串,则返回一个空字符串。

对于长度相同的两个字符串 a 和 b ,如果字符串 a 在与字符串 b 不同的第一个位置上的字符字典序更大,则字符串 a 的字典序大于字符串 b 。

例如,“abcd” 的字典序比 “abcc” 更大,因为在不同的第一个位置(第四个字符)上 d 的字典序大于 c 。

示例 1:

输入:s = “abcz”, k = 26
输出:“abda”
解释:字符串 “abda” 既是美丽字符串,又满足字典序大于 “abcz” 。
可以证明不存在字符串同时满足字典序大于 “abcz”、美丽字符串、字典序小于 “abda” 这三个条件。
示例 2:

输入:s = “dc”, k = 4
输出:“”
解释:可以证明,不存在既是美丽字符串,又字典序大于 “dc” 的字符串。

提示:

1 <= n == s.length <= 1e5
4 <= k <= 26
s 是一个美丽字符串

贪心,灵神题解:

class Solution {
public:string smallestBeautifulString(string s, int k) {k += 'a';int n = s.length();int i = n - 1; // 从最后一个字母开始s[i]++;        // 先加一while (i < n) {if (s[i] == k) {  // 需要进位if (i == 0) { // 无法进位return "";}// 进位s[i] = 'a';s[--i]++;} else if (i && s[i] == s[i - 1] || i > 1 && s[i] == s[i - 2]) {s[i]++; // 如果 s[i] 和左侧的字符形成回文串,就继续增加 s[i]} else {i++; // 反过来检查后面是否有回文串}}return s;}
};

题解:贪心(Python/Java/C++/Go)

520. 检测大写字母我们定义,在以下情况时,单词的大写用法是正确的:

全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。

示例 1:

输入:word = “USA”
输出:true
示例 2:

输入:word = “FlaG”
输出:false

提示:

1 <= word.length <= 100
word 由小写和大写英文字母组成

简单字符串模拟:

class Solution {
public:bool detectCapitalUse(string word) {int cnt = ranges::count_if(word, [](char c) { return isupper(c); });return cnt == 0 || cnt == word.length() || cnt == 1 && isupper(word[0]);}
};

503. 下一个更大元素 II

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

提示:

1 <= nums.length <= 1e4
-1e9 <= nums[i] <= 1e9

经典单调栈:

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int> ans(n, -1);stack<int> st;for (int i = 0; i < 2 * n; i++) {while (!st.empty() && nums[st.top()] < nums[i % n]) {ans[st.top()] = nums[i % n];st.pop();}st.push(i % n);}return ans;}
};

2732. 找到矩阵中的好子集(Hard)

给你一个下标从 0 开始大小为 m x n 的二进制矩阵 grid 。

从原矩阵中选出若干行构成一个行的 非空 子集,如果子集中任何一列的和至多为子集大小的一半,那么我们称这个子集是 好子集。

更正式的,如果选出来的行子集大小(即行的数量)为 k,那么每一列的和至多为 floor(k / 2) 。

请你返回一个整数数组,它包含好子集的行下标,请你将其 升序 返回。

如果有多个好子集,你可以返回任意一个。如果没有好子集,请你返回一个空数组。

一个矩阵 grid 的行 子集 ,是删除 grid 中某些(也可能不删除)行后,剩余行构成的元素集合。

示例 1:

输入:grid = [[0,1,1,0],[0,0,0,1],[1,1,1,1]]
输出:[0,1]
解释:我们可以选择第 0 和第 1 行构成一个好子集。
选出来的子集大小为 2 。

  • 第 0 列的和为 0 + 0 = 0 ,小于等于子集大小的一半。
  • 第 1 列的和为 1 + 0 = 1 ,小于等于子集大小的一半。
  • 第 2 列的和为 1 + 0 = 1 ,小于等于子集大小的一半。
  • 第 3 列的和为 0 + 1 = 1 ,小于等于子集大小的一半。
    示例 2:

输入:grid = [[0]]
输出:[0]
解释:我们可以选择第 0 行构成一个好子集。
选出来的子集大小为 1 。

  • 第 0 列的和为 0 ,小于等于子集大小的一半。
    示例 3:

输入:grid = [[1,1,1],[1,1,1]]
输出:[]
解释:没有办法得到一个好子集。

提示:

m == grid.length
n == grid[i].length
1 <= m <= 1e4
1 <= n <= 5
grid[i][j] 要么是 0 ,要么是 1 。

太难了,根本不会,抄了灵神题解,至今没搞懂:

class Solution {
public:vector<int> goodSubsetofBinaryMatrix(vector<vector<int>>& grid) {vector<int> a[1 << 5];vector<int> ans;int m = grid.size();int n = grid[0].size();for (int i = 0; i < m; i++) {int s = 0;for (auto c : grid[i])s = (s << 1) + c;if (s == 0) {ans.push_back(i);return ans;}a[s].push_back(i);}for (int i = 0; i < (1 << n); i++) {if (a[i].size() == 0)continue;for (int j = i + 1; j < (1 << n); j++) {if (a[j].size() == 0)continue;if ((i & j) == 0) {ans.push_back(a[i][0]);ans.push_back(a[j][0]);sort(ans.begin(), ans.end());return ans;}}}return ans;}
};

题解如下:严格证明+三种计算方法

2741. 特别的排列

给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:

对于 0 <= i < n - 1 的下标 i ,要么 nums[i] % nums[i+1] == 0 ,要么 nums[i+1] % nums[i] == 0 。
请你返回特别排列的总数目,由于答案可能很大,请将它对 109 + 7 取余 后返回。

示例 1:

输入:nums = [2,3,6]
输出:2
解释:[3,6,2] 和 [2,6,3] 是 nums 两个特别的排列。
示例 2:

输入:nums = [1,4,3]
输出:2
解释:[3,1,4] 和 [4,1,3] 是 nums 两个特别的排列。

提示:

2 <= nums.length <= 14
1 <= nums[i] <= 1e9

中等题还是不会,状压dp看了题解后有一些思路但是还是没写出来:

class Solution {
public:int MOD = 1e9 + 7; // 模数int specialPerm(vector<int>& nums) {int cache[1 << nums.size()][nums.size()]; // 记忆化memset(cache, -1, sizeof(cache));int mask = 0;function<int(int)> backtracking = [&](int tail) -> int {// BaseCase: 所有数字都被选中,1个合法排列int if_end = 1;for (int i = 0; i < nums.size(); i++) {if (((1 << i) & mask) == 0) {if_end = 0;break;}}if (if_end == 1)return 1;// Induction:存在未选中数字,进行回溯搜索int ans = 0;for (int i = 0; i < nums.size(); i++) {if ((mask & (1 << i)) == 0 &&(tail == -1 || nums[i] % tail == 0 ||tail % nums[i] == 0)) {mask |= (1 << i);                           // 修改状态if (cache[mask][i] == -1) {                 // 记忆化cache[mask][i] = backtracking(nums[i]); // 向下搜索}ans = (ans + cache[mask][i]) %MOD; // 利用已有记忆化结果,节省重复运算mask ^= (1 << i); // 恢复状态}}return ans;};return backtracking(-1); // 开始记忆化回溯}
};

2734. 执行子串操作后的字典序最小字符串

给你一个仅由小写英文字母组成的字符串 s 。在一步操作中,你可以完成以下行为:

选择 s 的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前一个字符。例如,‘b’ 用 ‘a’ 替换,‘a’ 用 ‘z’ 替换。
返回执行上述操作 恰好一次 后可以获得的 字典序最小 的字符串。

子字符串 是字符串中的一个连续字符序列。

现有长度相同的两个字符串 x 和 字符串 y ,在满足 x[i] != y[i] 的第一个位置 i 上,如果 x[i] 在字母表中先于 y[i] 出现,则认为字符串 x 比字符串 y 字典序更小 。

示例 1:

输入:s = “cbabc”
输出:“baabc”
解释:我们选择从下标 0 开始、到下标 1 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
示例 2:

输入:s = “acbbc”
输出:“abaab”
解释:我们选择从下标 1 开始、到下标 4 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
示例 3:

输入:s = “leetcode”
输出:“kddsbncd”
解释:我们选择整个字符串执行操作。
可以证明最终得到的字符串是字典序最小的。

提示:

1 <= s.length <= 3 * 1e5
s 仅由小写英文字母组成

简单贪心:

class Solution {
public:string smallestString(string s) {int opear = 0;for (int i = 0; i < s.size(); i++) {if (s[i] != 'a') {opear = 1;s[i] = s[i] - 1;} else {if (i != s.size() - 1) {if (opear == 0)continue;elsebreak;} else {if (opear == 0)s[i] = 'z';}}}return s;}
};

2742. 给墙壁刷油漆(Hard)

给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time ,分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠:

一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,开销为 cost[i] 单位的钱。
一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 。但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。
请你返回刷完 n 堵墙最少开销为多少。

示例 1:

输入:cost = [1,2,3,2], time = [1,2,3,2]
输出:3
解释:下标为 0 和 1 的墙由付费油漆匠来刷,需要 3 单位时间。同时,免费油漆匠刷下标为 2 和 3 的墙,需要 2 单位时间,开销为 0 。总开销为 1 + 2 = 3 。
示例 2:

输入:cost = [2,3,4,2], time = [1,1,1,1]
输出:4
解释:下标为 0 和 3 的墙由付费油漆匠来刷,需要 2 单位时间。同时,免费油漆匠刷下标为 1 和 2 的墙,需要 2 单位时间,开销为 0 。总开销为 2 + 2 = 4 。

提示:

1 <= cost.length <= 500
cost.length == time.length
1 <= cost[i] <= 1e6
1 <= time[i] <= 500

看出来要用dp,但是dp还是不熟练,01背包dp:

class Solution {
public:int paintWalls(vector<int>& cost, vector<int>& time) {int n = cost.size();vector<vector<int>> memo(n, vector<int>(n * 2 + 1, -1)); // -1 表示没有计算过auto dfs = [&](auto&& dfs, int i, int j) -> int {if (j > i) { // 剩余的墙都可以免费刷return 0;}if (i < 0) { // 上面 if 不成立,意味着 j < 0,不符合题目要求return INT_MAX / 2; // 防止加法溢出}// 注意 res 是引用int& res = memo[i][j + n]; // 加上偏移量 n,防止出现负数if (res != -1) {           // 之前计算过return res;}return res = min(dfs(dfs, i - 1, j + time[i]) + cost[i],dfs(dfs, i - 1, j - 1));};return dfs(dfs, n - 1, 0);}
};

灵神题解:两种方法:状态优化 / 转换成 0-1 背包

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

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

相关文章

多端圈子校园论坛系统源码搭建教程,新手轻松搭建!

圈子社交系统以用户为中心&#xff0c;提供直观易用的界面和流程。用户可轻松注册、浏览内容、加入或创建圈子&#xff0c;并与其他用户互动。系统强化兴趣圈子功能&#xff0c;智能推荐相关圈子。同时确保隐私和安全&#xff0c;采用先进的安全措施保护用户数据。系统需持续优…

《信号与系统》复试建议

目录 第一章 绪论 第二章 连续时间系统的时域分析 第三章 傅立叶变换&#xff08;重点&#xff09; 第四章 拉普拉斯变换&#xff08;重点&#xff09; 第五章 傅立叶变换在通信系统中的应用 第六章 信号的矢量空间分析 第七章 离散时间系统的时域分析 第八章 Z变换与离…

linux rocky9.2系统搭建sqle数据库审核平台

文章目录 前言一、环境准备?二、开始部署前言 关于SQLE SQLE 是由上海爱可生信息技术股份有限公司 开发并开源,支持SQL审核、索引优化、事前审核、事后审核、支持标准化上线流程、原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 产品特色 支持通过插件的形式扩展…

基于大数据架构的内容安全风控与分析

1 项目介绍 1.1 研究目的和意义 在数字化时代&#xff0c;内容安全成为了互联网企业面临的一个重要挑战。海量数据的产生与传播&#xff0c;伴随着不良信息和网络安全威胁的日益增加。因此&#xff0c;本课题旨在通过构建一个基于大数据架构的内容安全风控与分析系统&#xf…

早期结直肠癌筛查需重视,华大基因肿瘤检测助力精准医学发展

当前&#xff0c;结直肠癌已跃居中国肿瘤发病率的第二位&#xff0c;且多数患者在发现时已是晚期&#xff0c;其生存率相对较低。据国家癌症中心最新数据的揭示&#xff0c;2022年新增的结直肠癌病例数量高达51.71万&#xff0c;其中&#xff0c;死亡人数则达到了24万。值得注意…

基于MindSpore Quantum的Grover搜索算法和龙算法

如果你听过量子计算&#xff0c;那么你一定听说过Grover搜索算法。1996年&#xff0c;Lov Grover [1] 提出了Grover搜索算法&#xff0c;它是一种利用量子状态的叠加性进行并行计算并实现加速的算法。Grover搜索算法被公认为是继Shor算法后的第二大量子算法&#xff0c;也是第一…

库与表管理的终极指南

数据库的库和表的管理 库的管理1.库的创建2.数据库的查看和使用3.数据库的修改4.数据库的删除 表的管理1.表的创建2.表的修改3.表的删除4.查看一个表 阅读指南&#xff1a; 本文章是数据库教程系列的一部分&#xff0c;专注于数据库的库和表管理。读者可以根据兴趣选择阅读相关…

【Pytorch实战教程】torchvision中 transforms的用法

在 PyTorch 的 torchvision 库中,transforms 模块提供了一系列用于预处理图像和进行数据增强的工具。这些变换可以对数据进行标准化、裁剪、旋转等操作,是构建深度学习模型中图像处理流程的重要部分。 主要功能 数据类型转换: ToTensor:将 PIL 图像或 NumPy 数组转换为 Fl…

【数据科学】学习资源汇总(不定时更新)

好书推荐&#xff1a;BooksPDF/数据科学/Python数据科学手册.pdf at master zhixingchou/BooksPDF GitHub

解码数智升级良方:中国一拖、中原传媒、神火股份等企业数字化实践分析

大模型、AI等技术的成熟以及政策法规的细化&#xff0c;数据资源的权属论证、合规确权、资产论证等环节逐渐走向实用性、价值化。 而伴随着“业财税数融”综合性数字化成为企业数字化转型的主流选择&#xff0c;财务部门的纽带属性被放大&#xff0c;财务数据的融合能力成为企业…

查普曼大学团队使用惯性动捕系统制作动画短片

道奇电影和媒体艺术学院是查普曼大学的知名学院&#xff0c;同时也是美国首屈一指的电影学院之一&#xff0c;拥有一流电影制作工作室。 最近&#xff0c;道奇学院的一个学生制作团队接手了一个项目&#xff0c;该项目要求使用真人动作、视觉效果以及真人演员和CG角色之间的互动…

等保测评——云计算安全扩展要求测评项

什么是云计算 信息安全技术 云计算服务安全指南》&#xff08;GB/T 31167-2014&#xff09;对云计算做出如下定义&#xff1a; “通过网络访问可扩展的、灵活的物理或虚拟共享资源池&#xff0c;并按需自助获取和管理资源的模式” &#xff08;注&#xff1a;资源实例包括服务…

Reflexion:通过语言反馈增强的智能体

Reflexion: Language Agents with Verbal Reinforcement Learning Reflexion: language agents with verbal reinforcement learninghttps://proceedings.neurips.cc/paper_files/paper/2023/hash/1b44b878bb782e6954cd888628510e90-Abstract-Conference.html 1.概述 最近,Re…

C#上位机与PLC

在工业自动化的舞台上&#xff0c;C#上位机与PLC之间的通信是一曲精妙绝伦的交响乐。今天&#xff0c;我们将一起揭开C#上位机与PLC通信的三种神秘实现方法&#xff0c;探索它们如何共同谱写出高效、稳定、灵活的工业自动化乐章。 序幕&#xff1a;通信的“前奏” 在深入了解…

ubuntu下后台启动程序

1.启动 $ nohup python detect_mq.py > output.out 2>&1 & 这个命令是用来在后台运行一个 Python 脚本 detect_mq.py&#xff0c;并将脚本的输出重定向到文件 output.out。下面是这个命令的详细解释&#xff1a; nohup&#xff1a;这是一个命令&#xff0c;它告…

【知识学习】阐述Unity3D中MaterialTexture的概念及使用方法示例

在Unity3D中&#xff0c;Material和Texture是渲染过程中非常重要的两个概念&#xff0c;它们共同工作以实现丰富的视觉效果。 Material Material是Unity中的一个组件&#xff0c;用于定义物体表面的视觉属性。一个Material可以包含多种属性&#xff0c;如颜色、纹理、反射率等…

C# 在WPF .net8.0框架中使用FontAwesome 6和IconFont图标字体

文章目录 一、在WPF中使用FontAwesome 6图标字体1.1 下载FontAwesome1.2 在WPF中配置引用1.2.1 引用FontAwesome字体文件1.2.2 将字体文件已资源的形式生成 1.3 在项目中应用1.3.1 使用方式一&#xff1a;局部引用1.3.2 使用方式二&#xff1a;单个文件中全局引用1.3.3 使用方式…

windwos 文件权限查看

文章目录 windwos 文件权限查看,打开powershell命令行使用Qt C++读取文件的SDDL字符串步骤1:创建头文件`fileutils.h`步骤2:实现源文件`fileutils.cpp`步骤3:主函数`main.cpp`步骤4:CMakeLists.txt文件`CMakeLists.txt`详细说明编译和运行结论解读SDDLSDDL字符串结构示例SD…

黑马点评项目总结1-使用Session发送验证码和登录login和 使用Redis存储验证码和Redis的token登录

黑马先是总结了从session实现登录&#xff0c;然后是因为如果使用了集群方式的服务器的话&#xff0c;存在集群共享session互相拷贝效率低下的问题&#xff0c;接着引出了速度更快的内存型的kv数据库Redis&#xff0c; 使用Session发送验证码和登录login 举个例子&#xff1a…

免费分享:2015-2020年中国区域温度植被干旱指数(TVDI)月数据(附下载方法)

温度植被干旱指数(Temperature Vegetation Dryness Index&#xff0c;TVDI)是一种基于归一化植被指数(NDVI)与地表温度(LST)的土壤水分反演模型&#xff0c;能较好的进行干旱监测&#xff0c;尤其是监测特定年内某一时期整个区域的相对干旱程度&#xff0c;并可用于研究干旱程度…