Leetcode---368周赛
题目列表
2908. 元素和最小的山形三元组 I
2909. 元素和最小的山形三元组 II
2910. 合法分组的最少组数
2911. 得到 K 个半回文串的最少修改次数
一、元素和最小的山形三元组I


没什么好说的,不会其他方法就直接暴力,时间复杂度O(n^3),代码如下
class Solution {
public:int minimumSum(vector<int>& nums) {int n=nums.size();int ans=INT_MAX;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)for(int k=j+1;k<n;k++)if(nums[i]<nums[j]&&nums[j]>nums[k])ans=min(ans,nums[i]+nums[j]+nums[k]);return ans==INT_MAX?-1:ans;}
};
二、元素和最小的山形三元组II
这题和上一题一样,只是数据范围变大,需要优化时间复杂度,这也是老套路了,直接先预处理出前后缀最小值就行,然后枚举中间的那个元素,O(n)时间复杂度,代码如下
class Solution {
public:int minimumSum(vector<int>& nums) {int n=nums.size(),ans=INT_MAX;int suf[n];suf[n-1]=nums.back();for(int i=n-2;i>=0;i--)suf[i]=min(suf[i+1],nums[i]);for(int i=1,pre=nums[0];i<n-1;i++){if(pre<nums[i]&&nums[i]>suf[i+1])ans=min(ans,pre+nums[i]+suf[i+1]);pre=min(pre,nums[i]);}return ans==INT_MAX?-1:ans;}
};
三、合法分组的最少组数
这题还是有点难度的,但是思路还是很明显,先统计数字出现的次数,然后对相同数字进行分组,使得分出的组满足两个条件。关键是如何满足这两个条件,第一个已经满足了,主要看第二个
而第二个条件,其实已经在提醒我们需要枚举分组数量了,因为它限制了每个组的数量只能是x/x+1,都限定这么死了,你不枚举真的是可惜了,当然有人会想到二分,其实这题如果是枚举每个组的数量的话,是不满足二段性的(如果有能二分的方法,欢迎大家在评论区留言)
那么我来举个例子讲讲为什么不能二分?即为什么不满足二段性?其实我们在想二段性的时候,应该能感觉的出来这个二段性不是很"明确",因为它能被分成每组两个元素,和它能被分成每组三个元素没有必然关系,下面举个例子
假设我们要将7个1分成最少组,很显然如果每组的个数是7/8,肯定可以,如果每组的个数是6/7也是可以的,如果每组的个数是5/6,就不可以了,但是如果每组的个数是3/4,那么又可以了,所以不具有二段性,所以我们选择从大往小枚举,遇到的第一个符合条件的个数就是最优解
有人可能会对上面的枚举方法感到奇怪,会觉得枚举7/8和枚举6/7,这两个7是不是重复了?你如果单看那种能被7整除的数,那么当然是重复的,如果是那些不能被7整除的数,那么和7搭配的6/8就是两种不同组合方式
那么我们如何判断一个数y能否由x/x+1这两个数组合而成呢?即y=ax+b(x+1),要求a+b的值尽可能小(如果数学好,这题也已经被秒了,本质就是exgcd),如果数学不好,怎么办?
我们来想一想,如果我们要让分配的每个组的个数相差为1,其实就是让y平均分配到每组(注意这里的平均要求分出的组的个数最少),我们先用y/(x+1)得到n组,剩下m=y%(x+1)个,如果m+n>=x,那么我们可以从n中的m组各自拿出一个1,使得剩下的元素个数也符合条件,这样就能得到最少的分配组数,而如果m+n<x,显然这是不符合条件的
那么这时有人就会有另一个想法:如果我们先用y/x得到n组,剩余m=y/x个,如果m<=n就符合条件,如果m>n就不符合条件,是不是也行呢?看似和上面的想法很契合,很相似,但是这是不行的,不信可以去写一下代码试试,你会在[10,10,10,3,1,1]这个样例挂掉,这里简单说明一下原因,这n/k不能保证是最小分组,因为我们是每次的分组方案是k/k+1,你用n/k的结果其实和n/(k+1)天差地别,如果n=20,k=4,用n/k得到最小分组数为5,但是n/(k+1)的最小分组数却是4,更别说n更大了,只会相差越来越多,这里本质还是没有明白上面绿色的句子,即怎么平均才能让分出的组的个数尽可能的少?好好理解一下
代码如下
class Solution {
public:int minGroupsForValidAssignment(vector<int>& nums) {unordered_map<int,int>cnt;int m=INT_MAX;for(auto& e:nums) cnt[e]++;if(cnt.size()==1) return 1;for(auto&[a,c]:cnt) m=min(m,c);int ans=INT_MAX;function<bool(int)>check=[&](int k)->bool{int res=0;for(auto&[a,c]:cnt){int mod=c%(k+1);int x=c/(k+1);if(mod==0)res+=x;else if(k<=mod+x)res=res+x+1;elsereturn false;}ans=min(ans,res);return true;};for(int i=m;i>=1;i--){if(check(i))break;}return ans;}
};
四、得到k个半回文串的最小修改次数
这题主要是概念比较唬人,这个半回文串估计很多人都看蒙了,这里建议结合样例多手玩一下,基本上就懂了,这里就不对这个概念做深入讨论了,这里提醒一下,子串的长度>=2
这题其实不复杂,只要预处理一下每个数的真因子和每个子串变成半回文串需要修改的最小字符数,然后一个动态规划看看怎么划分子串就行了,关键是你能不能将思路写成代码
//预处理出每个数的真因子
int MX=201;
vector<vector<int>>v(MX);
int init=[](){for(int i=1;i<MX;i++)for(int j=2*i;j<MX;j+=i)v[j].push_back(i);return 0;
}();
class Solution {
public://计算每个子串变成半回文串的需要修改的最小字符数int get_min(const string& s){int n=s.size();int res=n;for(int d:v[n]){//枚举因子进行划分int m=0;for(int j=0;j<d;j++){//枚举每一个子序列for(int l=j,r=n-d+j;l<r;l+=d,r-=d){//计算每个子序列变成回文串需要修改的字符数m+=(s[l]!=s[r]);}}res=min(res,m);}return res;}int minimumChanges(string s, int k) {int n=s.size();vector<vector<int>>modify(n,vector<int>(n));//计算每个子串的最小修改次数for(int l=0;l<n-1;l++){for(int r=l+1;r<n;r++){modify[l][r]=get_min(s.substr(l,r-l+1));}}vector<vector<int>>memo(n,vector<int>(k,n+1));//n+1代表没有计算过,因为字符串最多只有n个元素,不可能需要修改n+1次function<int(int,int)>dfs=[&](int r,int k)->int{if(k==0) return modify[0][r];if(memo[r][k]<=n) return memo[r][k];int res=INT_MAX;for(int l=r-1;l>=2*k;l--){res=min(res,dfs(l-1,k-1)+modify[l][r]);}return memo[r][k]=res;};return dfs(n-1,k-1);//动态规划//vector<vector<int>>dp(k,vector<int>(n));//dp[0]=modify[0];//for(int i=1;i<k;i++){// for(int r=2*i+1;r<n;r++){// int res=INT_MAX;// for(int l=r-1;l>=2*i;l--){// res=min(res,dp[i-1][l-1]+modify[l][r]);// }// dp[i][r]=res;// }//}//return dp[k-1][n-1];}
};
相关文章:
Leetcode---368周赛
题目列表 2908. 元素和最小的山形三元组 I 2909. 元素和最小的山形三元组 II 2910. 合法分组的最少组数 2911. 得到 K 个半回文串的最少修改次数 一、元素和最小的山形三元组I 没什么好说的,不会其他方法就直接暴力,时间复杂度O(n^3),代…...
矢量图形编辑软件Illustrator 2023 mac中文版软件特点(ai2023) v27.9
illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软…...
一、Docker Compose——什么是 Docker Compose
Docker Compose 是一个用来定义和运行多容器 Docker 应用程序的工具,他的方便之处就是可以使用 YAML 文件来配置将要运行的 Docker 容器,然后使用一条命令即可创建并启动配置好的 Docker 容器了;相比手动输入命令的繁琐,Docker Co…...
Java提升技术,进阶为高级开发和架构师的路线
原文网址:Java提升技术,进阶为高级开发和架构师的路线-CSDN博客 简介 Java怎样提升技术?怎样进阶为高级开发和架构师?本文介绍靠谱的成长路线。 首先点明,只写业务代码是无法成长技术的。提升技术的两个方法是&…...
记一次 .Net+SqlSugar 查询超时的问题排查过程
环境和版本:.Net 6 SqlSuger 5.1.4.* ,数据库是mysql 5.7 ,数据量在2000多条左右 业务是一个非常简单的查询,代码如下: var list _dbClient.Queryable<tb_name>().ToList(); tb_name 下配置了一对多的关系…...
PHP危险函数
PHP危险函数 文章目录 PHP危险函数PHP 代码执行函数eval 语句assert()语句preg_replace()函数正则表达式里修饰符 回调函数call_user_func()函数array_map()函数 OS命令执行函数system()函数exec()函数shell_exec()函数passthru() 函数popen 函数反引号 实列 通过构造函数可以执…...
【ARM Cortex-M 系列 4 番外篇 -- 常用 benchmark 介绍】
文章目录 1.1 CPU 性能测试 MIPS 计算1.1.1 Cortex-M7 CPI 1.2 benchmark 小节1.3.1 Geekbenck 介绍 1.3 编译参数配置 1.1 CPU 性能测试 MIPS 计算 每秒百万指令数 (MIPS):在数据压缩测试中,MIPS 每秒测量一次 CPU 执行的低级指令的数量。越高越好&…...
web安全-原发抗抵赖
原发抗抵赖 原发抗抵赖也称不可否认性,主要表现以下两种形式: 数据发送者无法否认其发送数据的事实。例如,A向B发信,事后,A不能否认该信是其发送的。数据接收者事后无法否认其收到过这些数据。例如,A向B发…...
强化学习------PPO算法
目录 简介一、PPO原理1、由On-policy 转化为Off-policy2、Importance Sampling(重要性采样)3、off-policy下的梯度公式推导 二、PPO算法两种形式1、PPO-Penalty2、PPO-Clip 三、PPO算法实战四、参考 简介 PPO 算法之所以被提出,根本原因在于…...
node(三)express框架
文章目录 1.express介绍2.express初体验3.express路由3.1什么是路由?3.2路由的使用 1.express介绍 是一个基于Node平台的极简、灵活的WEB应用开发框架,官网地址:https://www.expressjs.com.cn/ 简单来说,express是一个封装好的工…...
linux find命令搜索日志内容
linux find命令搜索日志内容 查询服务器log日志 find /opt/logs/ -name "filename.log" | xargs grep -a "这里是要查询的字符"加上-a 是为了不报查出 binary 的错 服务器会返回 包含所查字符的整行日志信息...
CentOS 编译安装TinyXml2
安装 TinyXml2 Git 源码下载地址:https://github.com/leethomason/tinyxml2 步骤1:首先,你需要下载tinyxml2的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解…...
竞赛选题 深度学习人体跌倒检测 -yolo 机器视觉 opencv python
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…...
使用gson将复杂的树型结构转Json遇到的问题,写入文件为空
某个项目需要用到一个较为复杂的数据结构。定义成一个树型链表。 public class TreeNode { private String name; public String getName() { return name; } public void setName(String name) { this.name name; } public String getPartType() { retur…...
JavaScript异步编程:提升性能与用户体验
目录 什么是异步编程? 回调函数 Promise Async/Await 总结 在Web开发中,处理耗时操作是一项重要的任务。如果我们在执行这些操作时阻塞了主线程,会导致页面失去响应,用户体验下降。JavaScript异步编程则可以解决这个问题&…...
lossBN
still tips for learning classification and regression关于softmax的引入和作用分类问题损失函数 - MSE & Cross-entropy⭐Batch Normalization(BN)⭐想法:直接改error surface的landscape,把山铲平feature normalization那…...
【微信小程序】数字化会议OA系统之投票模块(附源码)
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯Ἲ…...
clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace
处理的语句 case 术语约定或备忘 case起止范围: 从冒号到下一个’case’开头, 简称有: case内 、case内容Ast: Abstract syntax tree: 抽象语法树没插入花括号的case 若case内, 以下任一条成立,则 跳过该case 即 不会对该case内容用花括号包裹. 有#define、有#include、有…...
python爬虫-某政府网站加速乐(简单版)实例小记
# -*- coding:utf-8 -*- # Time : 2023/10/23 17:06 # Author: 水兵没月 # File : 哈哈哈哈.py # Software: PyCharm ####################import random import requests# 代理 def get_proxy(proxy_typerandom.choice([1,2,3,4,5])):url "http://ZZZZZZZZZZZZZZZZZZ&qu…...
stable diffusion简介和原理
Stable Diffusion中文的意思是稳定扩散,本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型,它使用潜在扩散过程来生成图像,允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

