当前位置: 首页 > news >正文

个人练习-Leetcode-659. Split Array into Consecutive Subsequences

题目链接:https://leetcode.cn/problems/split-array-into-consecutive-subsequences/

题目大意:给出一个非递减数列nums[],判断其是否能被分割成若干个满足以下条件的子列:

  • 长度大于等于3
  • 元素严格递增且只相差1

子列的含义是:不改变元素的相对顺序,从原数列中抽取若干个元素组成新的数列。
分割的含义是:所有元素都会被分到某个子列,没有剩余。

思路:一开始的思路是,根据元素出现的次数,将其排列成若干个数列,比如在vector<vector<int>> subs中,subs[0]是仅出现一次的元素的数列;subs[1]是仅出现两次的元素的数列,以此类推。这样subs[][]就是一种对原数组的分割了,且保证了每个元素只出现一次。随后再对每个子列做调整,使其满足题意的两个条件。

长度大于等于3倒是不难解决,但要保证每个子列元素严格递增且增量为1并不容易。很难确定要从哪个子列中的哪个位置抽出哪个元素,放到另一个子列的哪个位置。似乎无法证明其可行性。

于是看了题解,原来用贪心做。不记录子列本身而是记录以x结尾的子列个数。

不过刚知道用贪心时我没有这么做,因为我的想法是:如果遍历到某个元素x,那么以x-1为结尾的子列应该是很多的,要挑选长度最短的那个子列才是最优的。于是在代码里多加了一层【以x-1为结尾的子列】的遍历(实际上这就是在记录子列本身了)。逻辑上应该没问题,然而时间超了…

这一版代码如下:

class Solution {
public:bool isPossible(vector<int>& nums) {map<int, vector<vector<int>>> endwithx;for (auto num : nums) {if (endwithx.find(num-1) == endwithx.end() || endwithx[num-1].size() == 0) {vector<int> tmp(1, num);endwithx[num].push_back(tmp);}else {vector<int> tgt;int min_len = endwithx[num-1][0].size(), min_idx = 0;for (int i = 1; i < endwithx[num-1].size(); i++) {auto sa = endwithx[num-1][i];if (sa.size() < min_len) {min_len = sa.size();min_idx = i;}}tgt = endwithx[num-1][min_idx];endwithx[num-1].erase(endwithx[num-1].begin()+min_idx, endwithx[num-1].begin()+min_idx+1);tgt.push_back(num);endwithx[num].push_back(tgt);}  }for (auto it = endwithx.begin(); it != endwithx.end(); it++) {for (auto sa : it->second) {if (sa.size() < 3)return false;}}return true;}
};

后来看了题解的写法,原来它记录的并不仅仅只是【以x-1为结尾的子列】,而是【以x-1为结尾且长度大于等于3的子列】。(这里注意因为x只会放到以x-1为结尾的子列后,因此第二个条件是都满足的)。也就是说,我的写法并不保证长度大于等于3,而是需要后面再判断(花费了更多时间)。而题解记录的就是长度大于等于3的子列,保证了合法性。

那么如何在放入时就确保子列长度大于等于3呢?答案是如果该元素x无法找到合适的子列插入时,它必须自己起头创造新的子列,那么又需要一个x+1和一个x+2。此时如果x+1x+2的剩余量不足了,直接返回false即可。否则,消耗一个x、一个x+1和一个x+2,组成新的一个【以x+2为结尾的子列】,显然这个子列是合法的。

完整代码

class Solution {
public:bool isPossible(vector<int>& nums) {map<int, int> cnt;map<int, int> endwithx;for (auto num : nums) {if (cnt.find(num) == cnt.end())cnt[num] = 1;else    cnt[num]++;}for (auto num : nums) {if (cnt[num]) {if (endwithx.find(num-1) == endwithx.end() || endwithx[num-1] == 0) {// create an new array starting with num, num+1, num+2if (cnt[num+1] && cnt[num+2]) {cnt[num]--;cnt[num+1]--;cnt[num+2]--;if (endwithx.find(num+2) == endwithx.end())endwithx[num+2] = 1;elseendwithx[num+2]++;       }elsereturn false;}else {cnt[num]--;endwithx[num-1]--;endwithx[num]++;}}}return true;}
};

相关文章:

个人练习-Leetcode-659. Split Array into Consecutive Subsequences

题目链接&#xff1a;https://leetcode.cn/problems/split-array-into-consecutive-subsequences/ 题目大意&#xff1a;给出一个非递减数列nums[]&#xff0c;判断其是否能被分割成若干个满足以下条件的子列&#xff1a; 长度大于等于3元素严格递增且只相差1 子列的含义是&…...

OTA升级差分包签名

制作差分包时添加-k <key_path>参数 ./build/tools/releasetools/ota_from_target_files -k <key_path> -i old.zip new.zip update.zip<key_path>如何取值&#xff1f;查看ProjectConfig.mk 如果MTK_SIGNATURE_CUSTOMIZATIONyes并且MTK_INTERNALno&#xf…...

使用Buildroot制作根文件系统

寒暄几句 学习了uboot、内核、busybox根文件系统&#xff0c;想着做一个音频播放器。最后发现好像busybox好像没有带aplay架构&#xff0c;这就很麻烦需要自己移植。为了简便我就找大佬沟通了一下&#xff0c;大佬推荐了Buildroot工具来制作根文件系统。 平台 开发板&#x…...

Java_Spring:5. 基于注解的 IOC 配置

目录 1 环境搭建 1.1 第一步&#xff1a;拷贝必备 jar 包到工程的 lib 目录。 1.2 第二步&#xff1a;使用Component 注解配置管理的资源 1.3 第三步&#xff1a;创建 spring 的 xml 配置文件并开启对注解的支持 2 常用注解 2.1 用于创建对象的注解 2.1.1 Component 2.1…...

Git下的.gitignore文件

.gitignore .gitignore是一个文件&#xff0c;这个文件用来指定哪些文件提交到 git 管理&#xff0c;也就是 git commit 不会提交这些文件 .gitignore文件的语法 注释 "#" 表示注释 # 注释 忽略指定文件/文件夹 直接写入文件或文件夹名即可&#xff0c;指定文…...

Unity集成GPT

GPT想必是最近互联网最火的话题了&#xff0c;作为一个Unity开发者&#xff0c;今天来介绍一下如何在Unity中使用GPT。 一、API 密钥 使用GPT的API首先要获得密钥&#xff0c;如下进入OpenAI官网(https://platform.openai.com/account/api-keys)–>选择自己的账号–>查…...

Xilinx FPGA Multiboot设计与实现(Spartan-6和Kintex-7为例)

文章目录 1. FPGA固件升级方案2. Golden镜像和Multiboot镜像简介3. ISE环境下实现(XC6SLX9)4. Vivado环境下实现(XC7K325T)5. Golden镜像Header分析6. 参考资料7. 示例工程ISE、Vivado、MicroBlaze系列教程 1. FPGA固件升级方案 FPGA的硬件可编程性给设计带来了很高的灵活…...

14、SpringMVC执行流程

文章目录14、SpringMVC执行流程14.1、SpringMVC常用组件1 DispatcherServlet&#xff08;前端控制器&#xff09;2 HandlerMapping&#xff08;处理器映射器&#xff09;3 Handler&#xff08;处理器&#xff09;4 HandlerAdapter&#xff08;处理器适配器&#xff09;5 ViewRe…...

2步搞定拼版!AD通用拼版技巧分享!

你是不是也看过很多拼版教程&#xff0c;一整篇文章全部都是文字说明和各种图示&#xff0c;照着一步步去做&#xff0c;都需要一些时间才能勉强搞定。 之前我用过AD20的自带拼版工具&#xff0c;功能上比较简单&#xff0c;而且菜单没有全部汉化&#xff0c;对于新手来说&…...

再学C语言47:字符串输出

C中有3个用于输出字符串的标准库函数&#xff1a;puts()&#xff0c;fputs()&#xff0c;printf() 一、puts()函数 示例代码&#xff1a; /* test of puts() function */ #include <stdio.h>#define ARR_T "I am an array."int main(void) {char str1[100] …...

银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划

如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心&#xff0c;实现知行果合一课程背景&#xff1a; 很多银行都在开展银行数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a;缺少针对性的银行数字化转型年度培训规划不清楚如…...

RFID技术在物流行业中的应用:优化物流流程,提高效率

随着物流行业的不断发展&#xff0c;如何优化物流流程、提高效率成为了每个物流从业者关注的重点。RFID技术作为一种先进的自动识别技术&#xff0c;正逐渐被广泛应用于物流行业&#xff0c;帮助企业降低成本、提高运营效率。本文将重点介绍RFID技术在物流行业中的应用&#xf…...

安卓机器学习框架学习:Android Neural Networks API (NNAPI)

Android Neural Networks API (NNAPI) 简介&#xff1a; 1、Android Neural Networks API (NNAPI) 是一个 Android C API&#xff0c;在 Android 设备上实现机器学习&#xff1b; 2、NNAPI 旨在为更高层级的机器学习框架&#xff08;如 TensorFlow Lite 和 Caffe2&#xff09…...

阿里云GPU服务器收费标准、学生价格及一个小时费用大全

阿里云GPU租用费用价格表&#xff0c;GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折优惠&#xff0c;阿里云百科分享阿里云GPU服务器学生优惠价格、GPU服务器收费价格表、GPU服务器多少钱一个小时等费用明细表&#x…...

Asp.net core 依赖注入 (带案例以及注释理解)

1.很多朋友不知道什么是依赖注入&#xff0c;接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于减少组件之间的耦合度。它的核心思想是&#xff0c;将组件之间的依赖关系从…...

【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

GO实现Redis:GO实现Redis集群(5)

采用一致性hash算法将key分散到不同的节点&#xff0c;客户端可以连接到集群中任意一个节点https://github.com/csgopher/go-redis本文涉及以下文件&#xff1a; consistenthash&#xff1a;实现添加和选择节点方法 standalone_database&#xff1a;单机database client&#x…...

高阶数据结构之 B树 B+树 B*树

文章目录B树B树节点的设计插入key的过程B树的验证B树的性能分析B树和B*树B树B*树总结B树、B树、B*树B树的应用做索引MySQL索引MyISAMInnoDBB树 在前面几章中我们介绍了AVL树和红黑树&#xff0c;简单复习一下&#xff0c;我们说到原本的二叉搜索树会存在缺陷&#xff08;不能保…...

CSS3之动画属性

系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录CSS3 中的动画第一步&#xff1a;定义一个动画第二步&#xff1a;执行这个动画第三步&#xff1a;暂停或启动这个动画过渡和动画的区别CSS3 中的动画 CSS3 动画是使元素从一种样式逐渐变化为…...

python --Matplotlib详解

安装 pip install matplotlib导包 import matplotlib.pyplot as plt绘制散点图 如果输入的是两个列表&#xff0c;一个表示 x 轴的值&#xff0c;一个表示 y 轴的值&#xff0c;那么就可以在直角坐标系中划出很多个点&#xff0c;然后将这些点用指定的线段连接起来就得到了散…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...