【算法】贪心算法:最大数C++

文章目录

  • 前言
  • 题目解析
  • 算法原理
    • 字典序
  • 代码示例
  • 策略证明

前言

题目的链接,大家可以先试着去做一下再来看一下思路。179. 最大数 - 力扣(LeetCode)

题目解析

还是老样子,把题目读懂,画出有用信息。

在这里插入图片描述

认真看示例,要好好去想一下,特殊示例的情况。

在这里插入图片描述

算法原理

在这里插入图片描述

字典序

插个小曲,介绍一下字典序。

  1. 概念:
    字典序(LexicographicalOrder),也称为词典序、字母序或词典顺序,是一种基于字符顺序的字符串比较方法。它类似于我们在字典中查找单词的顺序。
  2. 字符编码基础
    字典序依赖于字符的编码系统:
    ASCII:‘0’=48, ‘1’=49, …, ‘9’=57, ‘A’=65, ‘B’=66, …, ‘a’=97, ‘b’=98, …
    Unicode:包含更多字符,但数字和字母的顺序与ASCII一致。
  3. 比较规则
    字典序的核心规则是从左到右逐字符比较:

比较第一个字符: 如果字符不同,则根据字符的编码值(如ASCII或Unicode)决定顺序;编码值小的字符串排在前面 。
例一: “apple” vs “banana” → “apple” < “banana”(因为 ‘a’<‘b’);

如果第一个字符相同:比较第二个字符;依此类推,直到找到不同的字符。
例二:“dat” vs “dog” → “dat” < “dog”(因为’a’<‘o’)

所有字符都相同: 较短的字符串排在较长的字符串前面。
例三:“hello” vs “hell” → “hell” <“hello”(相同前缀,较短者优先)

  1. 示例解析

数字字符串比较:
“2” vs “10” → “10” < “2”(因为 ‘1’<‘2’)
“30” vs “4” → “30” <“4”(因为 ‘3’<‘4’)
“100” vs “2” → “100” < “2”(因为 ‘1’<‘2’)
混合比较:
“file9” vs “file10” → “file10” < “file9”(因为 ‘1’<‘9’)
“item2” vs “item10” → “item10” < “item2”(因为 ‘1’<‘2’)

  1. 在本代码中的应用
    在largestNumber算法中(largestNumber 算法通常指的是如何将一组非负整数重新排列,使得它们拼接后的数字是最大的。),我们使用字典序比较拼接后的字符串为什么有效呢。
//这行代码是自定义排序比较逻辑的核心,它决定了两个字符串在排序时的相对顺序。
//如果 s1 + s2 组成的字符串更大,返回 true,表示 s1 应该排在 s2 前面。
//如果 s2 + s1 更大,返回 false,表示 s2 应该排在 s1 前面。
return s1 + s2 > s2 + s1;

长度相等:s1+s2和s2+s1长度相同(len(s1)+len(s2))
字典序等价数值序:当两个数字字符串长度相同时,字典序大小关系等同于数值大小关系。

  1. 字典序与数值序的区别
比较方式“2” vs “10”“30” vs “4”“100” vs “2”
字典序“10” < “2”“30” < “4”“100” < “2”
数值序10 > 230 > 4100 > 2

字典序:基于字符编码从左到右比较.。
数值序:基于实际数值大小比较。

  1. 在算法中的重要性

在本问题中,使用字典序比较拼接字符串是高效的,因为:
避免了大数计算(拼接后可能超出整数范围) 。
利用字符串比较的内置优化。
当长度相同时,保持数值大小关系。

  1. 总结

字典序是一种基于字符编码顺序的字符串比较方法:
从左到右逐字符比较。
编码值小的字符排在前。
相同前缀时较短字符串排在前。
在等长数字字符串比较中等价于数值比较。

代码示例

class Solution {
public:string largestNumber(vector<int>& nums){//优化一下,把所有的整数转化为字符串,我们用字典序去比较,比直接转换整形比较好很多,vector<string> str;for(auto x : nums) str.push_back(to_string(x));//排序,拼接字符串,比较字典序。当两个数字字符串长度相同时,字典序大小关系等同于数值大小关系。//标准库的 sort 通常使用快速排序,这类比较排序算法的核心是通过多次比较和交换元素位置来达到有序。sort(str.begin(),str.end(),[](const string &s1, const string &s2){return s1 + s2 > s2 + s1;});//提取结果string ret;for(auto &s : str) ret += s;//特殊情况,数组中全是0不能返回"000...",应该返回"0"if(ret[0] == '0') return "0";return ret; }
};

策略证明

证明方法:全序关系

全序关系(Total Order)是指在一个集合X上,满足以下三个条件的二元关系:
完全性:对于集合中的任意两个元素a和b,要么a ≤ b,要么b ≤ a 。
反对称性:如果a ≤ b且b ≤ a,则a = b。
传递性:如果a ≤ b且b ≤ c,则a ≤ c。
全序关系也称为线性序或简单序。一个具有全序关系的集合称为全序集。
例如,实数集上的小于等于关系(≤)就是一个全序关系,因为任意两个实数都可以比较大小。

假设定义了集合{a,b,c,d,e,f,g},我从集合中任意挑选两个元素,如果这两个元素在你定义的比较规则下,满足全序关系的话,我们就说这个集合是可以排序的。
只要满足下面三个性质,就有全序关系。
1.完全性,2.反对称性,3.传递性

我们接下来就要去证明我们算法原理中的自定义排序是否有效。
在这里插入图片描述

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

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

相关文章

网络安全职业指南:探索网络安全领域的各种角色

本文旨在为对网络安全领域感兴趣的粉丝读者提供一份全面的职业指南。我们将探讨网络安全领域中各种不同的职业角色&#xff0c;包括其职责、所需技能以及职业发展路径&#xff0c;帮助你了解网络安全领域的职业选择&#xff0c;并为你的职业规划提供参考。网络安全职业概览 身处…

Design Vision:显示扇入/扇出逻辑

相关阅读 Design Visionhttps://blog.csdn.net/weixin_45791458/category_13006970.html?spm1001.2014.3001.5482 在使用Design Vision中查看示意图时&#xff0c;可以在示意图中查看所选单元(Cell)、引脚(Pin)、端口(Port)或线网(Net)的扇入/扇出逻辑。用户可以在当前激活的…

13.7 Meta LLaMA2-Chat核心技术突破:三重强化学习实现91.4%安全评分,超越ChatGPT的对话模型架构全解析

Meta LLaMA2-Chat核心技术突破:三重强化学习实现91.4%安全评分,超越ChatGPT的对话模型架构全解析 指令微调模型:LLaMA2-Chat 技术深度解析 LLaMA2-Chat 作为 Meta 推出的对话优化大模型,其技术实现展现了大模型对齐(Alignment)领域的前沿突破。与基础版 LLaMA2 相比,该…

二维仿射变换笔记

二维仿射变换笔记 1. 数学基础 1.1 变换矩阵 二维仿射变换使用3x3的齐次坐标矩阵表示: [a b tx] [c d ty] [0 0 1 ]其中: [a b; c d] 是线性变换部分,表示旋转、缩放和错切[tx; ty] 是平移部分最后一行 [0 0 1] 是齐次坐标的固定形式1.2 基本变换 1.2.1 平移变换 将点…

创建自定义Dataset类与多分类问题实战

codes 文章目录&#x1f31f; 6 多分类问题与卷积模型的优化&#x1f9e9; 6.1 创建自定义Dataset类⚠️ 数据集特点&#xff1a;&#x1f511; 关键实现步骤&#xff1a;&#x1f6e0;️ 自定义Dataset类实现&#x1f4ca; 数据集划分与可视化&#x1f9e0; 6.2 基础卷积模型&…

用vue自定义指令设置页面权限

1.按钮权限处理/*** v-hasPermi 按钮权限处理*/import store from /storeexport default {inserted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions store.getters && store.getters.permissionsif (value…

JPA / Hibernate

1. JPA 和 Hibernate 有什么区别&#xff1f;JPA 是 Java 官方提出的一套 ORM 规范&#xff0c;它只定义了实体映射、关系管理、查询接口等标准&#xff0c;不包含具体实现。Hibernate 是对 JPA 规范的最常用实现&#xff0c;提供了完整的 ORM 功能&#xff0c;并扩展了许多 JP…

kibana显示未准备就绪

kibana显示未准备就绪 最近在研究新版本的ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;栈时遇到了一个问题&#xff1a;虽然服务器本身能够访问ELK服务&#xff0c;但通过浏览器尝试访问时却无法成功。这里我将分享一些可能的排查步骤和解决方案。连接es的地址…

语音对话秒译 + 视频悬浮字 + 相机即拍即译:ViiTor 如何破局跨语言场景?

在跨语言信息获取场景中&#xff0c;语言壁垒常导致效率降低。ViiTor Translate 试图通过 “场景化功能布局” &#xff0c;覆盖 语音、视频、图像、文本 四大维度翻译需求。以下基于产品功能展示&#xff0c;拆解其核心能力&#xff1a; 1. 实时语音对话翻译&#xff1a;打破交…

国内第一梯队终端安全产品解析:技术与场景实践

国内终端安全市场的第一梯队产品&#xff0c;通常具备技术领先性、场景覆盖度和规模化落地能力。结合 2025 年最新行业动态与实战案例&#xff0c;以下从技术架构、核心能力和典型应用三个维度&#xff0c;解析当前市场的头部产品及其差异化价值。一、技术架构与市场格局国内终…

FTP 备份,一种更安全的备份方式

备份数据后最重要的任务是确保备份安全存储&#xff0c;最好是异地存储。您可以通过物理方式将备份介质&#xff08;例如磁带和 CD/DVD&#xff09;移动到异地位置。这是一个乏味、耗时、不方便且不可靠的方式。更简单的解决方案是通过 FTP 备份到保存在异地的服务器。什么是 F…

理解 HTTP POST 请求中的 json 和 data 参数

在使用 Python 发送 HTTP POST 请求时&#xff08;无论是使用 requests 还是 aiohttp&#xff09;&#xff0c;json 和 data 参数有明确的区别和使用场景。理解这些区别对正确构建请求至关重要。关键区别特性json 参数data 参数内容类型自动设置为 application/json需要手动设置…

C#反射机制与Activator.CreateInstance

本文仅作为参考大佬们文章的总结。 反射是C#和.NET框架中一项强大的功能&#xff0c;允许程序在运行时检查、创建和操作类型、方法、属性等元数据。作为反射机制的核心组件&#xff0c;Activator.CreateInstance提供了动态实例化对象的灵活方式。本文将全面剖析C#反射的原理、…

Linux的用户和用户组与权限解析、环境变量说明与配置、sudo配置解析和使用

一、Linux的用户及用户组与权限 1.1、Linux的用户和用户组内容介绍 Linux的用户角色分类序号Linux的用户角色说明1超级用户拥有对系统的最高管理权限&#xff0c;可执行任意操作&#xff0c;默认是root用户2普通用户只能对自己目录下的文件进行访问和修改&#xff0c;具有登录系…

图解LeetCode:79递归实现单词搜索

网格 (board): 单词搜索 中等 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”…

2025 R3CTF

文章目录EvalgelistSilent Profit&#xff08;复现&#xff09;Evalgelist <?phpif (isset($_GET[input])) {echo <div class"output">;$filtered str_replace([$, (, ), , ", "", "", ":", "/", "!&…

WebView JSBridge 无响应问题排查实录 全流程定位桥接调用失效

在混合开发项目中&#xff0c;Web 页面与 Native 的通信桥梁——JSBridge&#xff0c;承担着极为关键的角色。它不仅让网页能调起原生功能&#xff08;分享、登录、拍照等&#xff09;&#xff0c;也支持原生传值、事件回调。 然而&#xff0c;当 JSBridge 调用“没有响应”、c…

前端构建工具 Webpack 5 的优化策略与高级配置

前端构建工具 Webpack 5 的优化策略与高级配置 当你的项目启动需要一分钟&#xff0c;或者每次热更新都像在“编译整个宇宙”时&#xff0c;你可能已经意识到了一个问题&#xff1a;前端构建性能&#xff0c;正成为开发效率的瓶颈。Webpack 作为现代前端开发的基石&#xff0c;…

tun2socks原理浅析

tun2socks 的原理是将TUN 设备上的IP 数据包转换为SOCKS 协议数据&#xff0c;然后通过SOCKS 代理服务器发送。简单来说&#xff0c;它利用TUN 设备模拟一个虚拟网络接口&#xff0c;将所有流经该接口的网络流量重定向到SOCKS 代理&#xff0c;从而实现流量的代理转发&#xff…

Go从入门到精通(22) - 一个简单web项目-统一日志输出

Go从入门到精通(21) - 一个简单web项目-统一日志输出 统一日志输出 文章目录Go从入门到精通(21) - 一个简单web项目-统一日志输出前言日志库横向对比zap 使用安装依赖创建日志配置修改主程序的日志在处理函数中使用日志日志示例控制台输出文件输出&#xff08;json&#xff09…