力扣(LeetCode)2578. 最小和分割(C++)

news2024/11/22 8:52:12
哈希集合

请读者思考,num拆分成num1和num2,要使得num1 + num2最小,应满足两条性质:

  1. num1和num2位数相同,或最多差一位。
  2. num1和num2应按数值从小到大在num中取数。

想到统计num的位数,以实现性质1的需要;想到用哈希集合a[10],统计数字{0~9}在num中出现的次数,以实现性质2的需要。

请看更具体的性质:

  1. num是奇数时,num1和num2最多差一位;num是偶数时,num1和num2位数相同。
  2. num1先取一个数,num2再取一个数,取数时按数值从小到大在num中取数。

请看下列代码:

class Solution {
public:
    int splitNum(int num) {
        int a[10] = { 0 };
        int count = 0;
        int num1  = 0, num2 = 0;
        while (num) {
            count ++;
            a[num % 10] ++;
            num /= 10;
        }
        if (count & 1) { // 奇数
            count --;
            for (int i = 0; i < 10; i ++) {
                if (a[i]) {
                    a[i] --;
                    num1 += i;
                    break;
                }
            }
        } 
        while (count) {
            for (int i = 0; i < 10; i ++) {
                if (a[i]) {
                    num1 *= 10;
                    num1 += i;
                    a[i] --;
                    count --;
                    break;
                }
            }
            for (int i = 0; i < 10; i ++) {
                if (a[i]) {
                    num2 *= 10;
                    num2 += i;
                    a[i] --;
                    count --;
                    break;
                }
            }
        }
        return num1 + num2;
    }
};

更具体的,我们发现奇数无需区分,请看推理:
设num是奇数,num1多取了一位数(比num2多一位)。不考虑num1的首位,num1的后续排列只有两种(交替取数),且num1的排列刚好和num2的排列相反。因此{num1的排列} + {num2的排列}是一个定值(按性质1/2交替取数的前提下!!),所以奇偶数无需区分。

class Solution {
public:
    int splitNum(int num) {
        int a[10] = { 0 };
        int count = 0;
        int num1  = 0, num2 = 0;
        while (num) {
            count ++;
            a[num % 10] ++;
            num /= 10;
        }
        while (count) {
            for (int i = 0; i < 10; i ++) {
                if (a[i]) {
                    num1 *= 10;
                    num1 += i;
                    a[i] --;
                    count --;
                    break;
                }
            }
            for (int i = 0; i < 10; i ++) {
                if (a[i]) {
                    num2 *= 10;
                    num2 += i;
                    a[i] --;
                    count --;
                    break;
                }
            }
        }
        return num1 + num2;
    }
};

时间复杂度 O ( l o g n ) O(logn) O(logn) : n n n 是数字大小,按数位处理数字的时间复杂度 O ( l o g 10 n ) O(log_{10}n) O(log10n) 。忽略常数,时间复杂度 O ( l o g n ) O(logn) O(logn)
空间复杂度 O ( ∣ C ∣ ) O(|C|) O(C) : 哈希集合的大小 ∣ C ∣ |C| C,空间复杂度 O ( ∣ C ∣ ) O(|C|) O(C)

AC

ac

致语
  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。

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

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

相关文章

JavaSE的常用API学习——字符串相关

目录 一、什么是API 二、String字符串 (一)创建String对象的两种方式 1.直接赋值的内存模型 2.new的内存模型 (二)字符串之间的比较与equals 1.运算符 2.equls()方法 三、StringBuilder的用法 1.StringBuilder的构造方法 2.StringBuilder的常用成员方法 3.小练习&a…

Java中的异常处理方法

在Java开发中&#xff0c;异常处理是必不可少的一部分。良好的异常处理机制可以提高代码的可读性、可靠性&#xff0c;保证程序的稳定性。本文将深度剖析Java中的异常处理机制&#xff0c;并分享一些最佳实践方法&#xff0c;帮助您在实际项目中优雅地处理异常。 一、Java异常…

我用PYQT5做的第一个实用的上位机项目(五)

制作一个动态仪表盘。 具体过程参照前面技术储备阶段的文章&#xff1a; PYQT制作动态时钟-CSDN博客 使用PYQT5简单制作动态仪表盘-CSDN博客 仪表盘由以下部件构成&#xff1a;背景 指针 表盘 进度条&#xff08;设定值&#xff09; 遮罩 设定和显示 其中表盘、 进度条和指…

UWB PDOA定位原理

以下是笔记总结,内容不完全正确 1,什么是PDOA PDOA &#xff0c;英文全称是Phase-Difference-of-Arrival&#xff0c;信号到达相位差 PDOA定位算法的原理如下&#xff1a; UWB基站上放置两个相同且间隔d<λ/2的天线&#xff0c;UWB标签上的信号到达两个天线的相位差就在-180…

实体机 安装 centos

实体机 安装 centos 制作U盘的时候&#xff0c;使用的ultraISO 同样方法一个u盘制作的有问题&#xff0c; 另外一个制作的没有问题。 可能和选择 usb-hdd 或者 usb-hdd 有关 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ 参考文档&#xff1a; http:…

数据结构的魔法:高级算法优化实战

文章目录 数据结构与算法&#xff1a;基础知识数据结构算法 高级算法优化实战1. 数据缓存2. 哈希表优化3. 算法优化 高级算法优化的挑战结论 &#x1f389;欢迎来到数据结构学习专栏~数据结构的魔法&#xff1a;高级算法优化实战 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;…

ui设计师简历自我评价的范文

ui设计师简历自我评价的范文篇一 本人毕业于艺术设计专业&#xff0c;具有较高的艺术素养&#xff0c;平时注重设计理论知识的积累&#xff0c;并将理论应用到作品中。了解当下设计的流行趋势&#xff0c;设计注重细节、重视用户体验&#xff0c;对色彩搭配有着浓厚的兴趣&…

[经验]如何解决python环境中的版本冲突问题

总结一下最近的经验 文章目录 一.报了什么错的时候可能是版本冲突二.解决版本冲突的工作流1.pip check2.libraries.io3.查看PyPI、官方文档和GitHub issues3. StackOverflow等各种类似平台4.借助AI(如果用perplexity等联网的ai相当于在这一步综合了前面步骤) 一.报了什么错的时…

XPath在数据采集中的运用

在进行数据采集和信息提取的过程中&#xff0c;XPath是一种非常强大且灵活的工具。它可以在HTML或XML文档中定位和提取特定的数据&#xff0c;为数据分析和应用提供了良好的基础。本文将介绍XPath的基本概念和语法&#xff0c;并分享一些实际操作&#xff0c;帮助您充分了解XPa…

web3.0时代分布式网络协议的异同

Web3.0时代标志着分布式网络协议的兴起&#xff0c;其中IPFS&#xff08;InterPlanetary File System&#xff09;和NDN&#xff08;Named Data Networking&#xff09;是备受瞩目的项目。尽管它们都属于分布式网络协议领域&#xff0c;但在多个方面存在显著区别。以下是IPFS和…

Elasticsearch:使用 huggingface 模型的 NLP 文本搜索

本博文使用由 Elastic 博客 title 组成的简单数据集在 Elasticsearch 中实现 NLP 文本搜索。你将为博客文档建立索引&#xff0c;并使用摄取管道生成文本嵌入。 通过使用 NLP 模型&#xff0c;你将使用自然语言在博客文档上查询文档。 安装 Elasticsearch 及 Kibana 如果你还没…

如何做好互联网产品需求分析?看这里!

文章目录 &#x1f31f;需求分析&#x1f34a;领域知识分析&#x1f34a;技术知识分析&#x1f389;人工智能技术的基本原理&#x1f389;开发工具和组件库&#x1f389;数据处理和模型训练&#x1f389;代码库和技术标准 &#x1f34a;数据分析&#x1f389;准备数据&#x1f…

途虎养车上市、京东养车“震虎”,如何突围汽车后市场?

“汽车后市场第一股”终于来了&#xff01; 赶在十一黄金周之前&#xff0c;途虎养车股份有限公司(09690.HK&#xff0c;下称“途虎养车”)于9月26日挂牌港交所&#xff0c;开盘价为28港元/股&#xff0c;与发行价持平&#xff1b;IPO首日报收29.50港元/股&#xff0c;涨幅5.3…

【图像处理GUI】图像颜色过滤、颜色强调、反转颜色等(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Tomcat历史版本下载地址(Tomcat7或更早)

官网地址直达 随便选择一个版本 点击找到自己想要的版本下载就可以了&#xff01;

干洗店会员管理系统上门洗鞋小程序介绍

干洗店管理系统&#xff0c;洗衣洗鞋店收银会员管理小程序&#xff0c;是在传统的洗护行业中&#xff0c;使用现在比较流行的线上下单系统&#xff0c;可以帮助门店实现便捷收银、会员管理、商品销售等功能。 具体如下&#xff1a; 1.会员管理&#xff1a;支持会员储值&#xf…

CSS 之 table 表格布局

一、简介 ​ 除了使用HTML的<table>元素外&#xff0c;我们还可以通过display: table/inline-table; 设置元素内部的布局类型为表格布局。并结合table-cell、table-row等相关CSS属性值可以实现HTML中<table>系列元素的效果&#xff0c;具有表头、表尾、行、单元格…

面试题:如何正确的停掉线程?

文章目录 前言为什么不强制停止如何用 interrupt 停止线程sleep 期间能否感受到中断停止线程的方式有几种总结 前言 启动线程需要调用 Thread 类的 start() 方法&#xff0c;并在 run() 方法中定义需要执行的任务。启动一个线程非常简单&#xff0c;但如果想要正确停止它就没那…

在PicGo上使用github图床解决typora上传csdn图片不显示问题(保姆级教程)

文章目录 在PicGo上使用github图床解决typora上传csdn图片不显示问题&#xff08;保姆级教程&#xff09;1、typora上传csdn图片不显示&#xff08;外链图片转存失败&#xff09;2、PicGo2.1、PicGo下载2.2、PicGo使用2.2.1、对PicGo完成基本的配置2.2.2、配置github图床2.2.3、…

vue3+elementPlus:el-tree复制粘贴数据功能,并且有弹窗组件

在tree控件里添加contextmenu属性表示右键点击事件。 因右键自定义菜单事件需要获取当前点击的位置&#xff0c;所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置。 //html <div class"box-list"><el-tree ref"treeRef" node-key"id…