小于n的最大数

news/2024/9/22 1:32:05/文章来源:https://www.cnblogs.com/liang302/p/18424744

贪心+回溯:
找某位的最小值的时候用set实现的二分

求hack

#include <algorithm>
#include <unordered_set>
#include <vector>
#include <iostream>
using namespace std;
// getMaxDigitLtD 获取小于指定数字的最大数字。
int getMaxDigitLtD(const vector<int> &digits, int digit) {for (auto it = digits.rbegin(); it != digits.rend(); it++) {if (*it < digit) {return *it;}}return -1;
}// getMaxNumLtN 获取小于 n 的最大数。
int getMaxNumLtN(vector<int> &digits, int n) {// 获取 n 的每一位数字。12345vector<int> ndigits;while (n > 0) {ndigits.push_back(n % 10);n /= 10;}// 排序给定的数字数组。 5 4 3 2 1 sort(digits.begin(), digits.end());// 数字写入 map 用于快速查看是否存在。unordered_set<int> set;for (auto v : digits) {set.insert(v);}// 目标数的每一位数字。vector<int> tdigits(ndigits.size());// 从原数字高位到低位遍历,尽可能地取相同值,除了最后一位,最后一位需要比他小。for (int i = ndigits.size() - 1; i >= 0; i--) {// 存在相同的数字,可以直接看下一位(最后一位除外)。if (i > 0 && set.find(ndigits[i]) != set.end()) {tdigits[i] = ndigits[i];continue;}// 找不到相同的数字,那就找到存在小于当前位的最大数字。// 如果最高位真的找到比他小的而且不是0的,说明之后数字都可以取nums最大 ,break // 123 直接放99 // 213 直接放09 auto d = getMaxDigitLtD(digits, ndigits[i]);if (d != -1) {tdigits[i] = d;break;}// 需要回溯。数组{2} target:219 2xy// 现在x=2就已经无敌了  for (i++; i < ndigits.size(); i++) {tdigits[i] = 0;// 小于当前位的最大数字。d = getMaxDigitLtD(digits, ndigits[i]);if (d > 0) {tdigits[i] = d;break;}// 最高位也没有小于其的最大数字。if (i == ndigits.size() - 1) {tdigits.resize(tdigits.size() - 1);}}break;}// 拼装目标数。int target = 0;for (int i = tdigits.size() - 1; i >= 0; i--) {target *= 10;if (tdigits[i] > 0) {  target += tdigits[i];continue;}// 取数字数组中最大的数字。target += digits.back();}return target;
}int main() {auto digits = vector<int>{5, 9};cout << getMaxNumLtN(digits, 5555) << endl;digits = vector<int>{0, 2, 9, 4};cout << getMaxNumLtN(digits, 2533) << endl;digits = vector<int>{1, 2, 5, 4};cout << getMaxNumLtN(digits, 2543) << endl;digits = vector<int>{1, 2, 5, 4};cout << getMaxNumLtN(digits, 2541) << endl;digits = vector<int>{1, 2, 9, 4};cout << getMaxNumLtN(digits, 2111) << endl;}

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

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

相关文章

《MySQL 进阶篇》二十:锁

MySQL 锁的分类,表锁和行锁有哪些类型?Author: ACatSmiling Since: 2024-09-21锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),就需要保证这个…

《MySQL 进阶篇》二十一:MVCC

MySQL 是如何处理并发问题的?什么是 MVCC?MVCC 的原理是什么?Author: ACatSmiling Since: 2024-09-21什么是 MVCC MVCC:Multiversion Concurrency Control,多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在 InnoDB 的事…

15.Python基础篇-文件操作

文件的打开与关闭 第一种方法:open函数 open函数:打开一个文件,并返回文件对象。如果文件无法打开,会抛出 OSError异常。 open函数的参数介绍: file参数 要打开的文件路径。可以是绝对路径也可以是相对路径 mode参数 打开文件的模式。分为:r:只读。文件的指针会放在文件…

《MySQL 进阶篇》十七:数据库其他调优策略

MySQL 数据库的其他调优策略。Author: ACatSmiling Since: 2024-09-21数据库调优的措施 调优的目标尽可能节省系统资源,以便系统可以提供更大负荷的服务(吞吐量更大)。 合理的结构设计和参数调整,以提高用户操作响应的速度(响应速度更快)。 减少系统的瓶颈,提高 MySQL 数…

《MySQL 进阶篇》十九:事务日志

MySQL redo log 和 undo log。Author: ACatSmiling Since: 2024-09-21事务有 4 种特性:原子性、一致性、隔离性和持久性。那么事务的 4 种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。 而事务的原子性、一致性和持久性由事务的redo log和undo log来保证。redo l…

《MySQL 进阶篇》十八:事务基础知识

MySQL 事务的定义、ACID 特性,以及事务的隔离级别。Author: ACatSmiling Since: 2024-09-21数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当有了事务就会让数据库始终保持一致性,同时还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会…

《MySQL 进阶篇》十五:索引优化和查询优化

MySQL 索引优化,以及查询优化。Author: ACatSmiling Since: 2024-09-21数据库调优的维度:索引失效、没有充分利用所以 —— 索引建立。 关联查询太多 JOIN(设计缺陷或不得已的需求)—— SQL 优化。 服务器调优及各个参数设置(缓冲、 线程数)—— 调整 my.cnf。 数据过多 …

《MySQL 进阶篇》十六:数据库的设计规范

MySQL 数据库设计需要遵循什么规范?什么是范式?什么是反范式?Author: ACatSmiling Since: 2024-09-21为什么需要数据库设计 我们在设计数据表的时候,要考虑很多问题。比如:用户都需要什么数据?需要在数据表中保存哪些数据? 如何保证数据表中数据的正确性?当插入、删除、…

《MySQL 基础篇》十一:索引的存储结构

MySQL 索引的存储结构,以及推演过程。Author: ACatSmiling Since: 2024-09-21为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构。 常将索引比作教科书的目录部分(实际上不是完全一样),通过目录找到对应文章的页码,便可快速定位到需要的文章。MySQL 中也是…

《MySQL 基础篇》十二:InnoDB 存储引擎的数据结构

MySQL InnoDB 存储引擎的数据结构。Author: ACatSmiling Since: 2024-09-21数据库的存储结构:页 索引结构提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说时存储在页结构中。另一方面,索引实在存储引擎中实现的,MySQL 服务器上的存储引擎负责对表…

《MySQL 基础篇》九:存储过程、流程控制和触发器

MySQL 的存储过程与函数、变量、流程控制与游标,以及触发器的使用。Author: ACatSmiling Since: 2024-09-20存储过程与函数 MySQL 从 5.0 版本开始支持存储过程和函数。存储过程和函数能够将复杂的 SQL 逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的 SQL 逻辑,而…

《MySQL 基础篇》十:逻辑架构和存储引擎

MySQL 的逻辑架构图,以及存储引擎简介。Author: ACatSmiling Since: 2024-09-21逻辑架构 逻辑架构剖析 服务器处理客户端请求 首先,MySQL 是典型的 C/S 架构,即Client/Server架构,服务器端程序使用的是mysqld。 不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现…