2605. 从两个数字数组里生成最小数字

2023-11-09

Tag

【贪心】【位运算】【数组】


题目来源

2605. 从两个数字数组里生成最小数字


题目解读

给定两个各自只包含数字 19 的两个数组,每个数组中的元素互不相同,请你返回最小的数字,这个数字的数位至少包含两个数组中的数字。


解题思路

贪心的思想,如果两个数组有交集,则答案为交集中的最小值;否则,需要找出各个数组中的最小值,用最小值组成最小答案。

我们先来讲述最小值的计算,方法有很多,可以先升序排序(降序排序)再返回首位置元素(末位置元素),还可以直接使用 API *min_element() 来计算数组中的最小值。

计算两个数组的交集有以下两种方法:

  • 枚举比较法。
  • 集合的位运算表示法。

方法一:枚举比较法

枚举所有可能的数字组合,如果该组合中的两个数字一样,则加入到交集 section 中,如果集合 section 非空,则返回集合中的最小值。

实现代码

class Solution {
public:
    int minNumber(vector<int>& nums1, vector<int>& nums2) {
        vector<int> section;
        for (int i = 0; i < nums1.size(); ++i) {
            for (int j = 0; j < nums2.size(); ++j) {
                if (nums1[i] == nums2[j]) {
                    section.push_back(nums1[i]);
                }
            }
        }

        if (!section.empty()) {
            return *min_element(section.begin(), section.end());
        }

        int min1 = *min_element(nums1.begin(), nums1.end());
        int min2 = *min_element(nums2.begin(), nums2.end());
        return  min(min1 * 10 + min2, min2 * 10 + min1);
    }
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n 为最大的数组长度。

空间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

方法二:集合的位运算表示法

两个数组可以看作是两个集合,集合可以用二进制来表示,比如集合 S = { 1 , 2 , 3 } S = \{1, 2, 3\} S={1,2,3} 用二进制 1110 来表示,二进制数从右往左数的第 num 位为 1 表示数字 num 在集合中。

于是数组的交集就可以使用集合的交集来表示,交集可以用二进制的与操作计算,然后与操作得到的二进制数从右到左找到第一个 1 的位置,即为两个数组交集中的最小值,这里我们可以使用 __builtin_ctz() 来查找从右至左第一个 1 出现的位置。

关于集合用运算来表示,如果还有不明白的地方可以参考 位运算基础与应用 这篇文章。

实现代码

class Solution {
public:
    int minNumber(vector<int>& nums1, vector<int>& nums2) {
        // 位运算

        int mask1 = 0, mask2 = 0;
        for (int x : nums1) mask1 |= 1 << x;
        for (int x : nums2) mask2 |= 1 << x;
        int mask = mask1 & mask2;
        if (mask) return __builtin_ctz(mask);

        int x = __builtin_ctz(mask1), y = __builtin_ctz(mask2);
        return min(x * 10 + y, 10 * y + x);
    }
};

复杂度分析

时间复杂度: O ( n + m ) O(n+m) O(n+m),其中 n n n 为数组 nums1 的长度, m m m 为数组 nums2 的长度。

空间复杂度: O ( 1 ) O(1) O(1),仅使用了几个额外的变量。


写在最后

以上就是本篇文章的内容了,感谢您的阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2605. 从两个数字数组里生成最小数字 的相关文章

随机推荐

  • Sentinel原理与Demo

    Sentinel 是什么 随着微服务的流行 服务和服务之间的稳定性变得越来越重要 Sentinel 以流量为切入点 从流量控制 熔断降级 系统负载保护等多个维度保护服务的稳定性 Sentinel 具有以下特征 丰富的应用场景 Sentine
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • Docker help帮助文档

    1 查看 docker help 帮助 docker help 2 用法 docker 选项 命令 3 选项 客户端配置文件的配置字符串位置 默认为 root docker D 启用调试模式 H 要连接的主机列表守护进程套接字 l 设置日志
  • Centos7.3安装和配置Mysql5.7

    第一步 获取mysql YUM源 进入mysql官网获取RPM包下载地址 https dev mysql com downloads repo yum 点击 下载 右击 复制链接地址 https dev mysql com get mysq
  • 源码剖析transformer、self-attention

    原文链接 首先给大家引入一个github博客 这份代码是我在看了4份transformer的源码后选出来的 这位作者的写法非常易懂 代码质量比较高 GitHub Separius BERT keras Keras implementatio
  • 一步一步教你用idea上交代码到gitee(图文解释)

    一步一步教你用idea上交代码到gitee 图文解释 文章目录 一步一步教你用idea上交代码到gitee 图文解释 工具准备 具体操作 结语 工具准备 首先 我们进行代码的提交需要两个工具包 在我的上一篇中有讲 大家可以自行去提取 2条消
  • .net 批量注册服务

    假设我们需要注册xxxQuery服务 例如下图中的BarQuery和FooQuery 传统的做法是 services TryAddScoped
  • vscode 运行和调试 javascript 代码

    安装node 安装vscode 扩展包 code runer 配置vs code下有关F5的操作的文件 参考地址
  • 【Zabbix实战之运维篇】Zabbix监控Docker容器配置方法

    Zabbix实战之运维篇 Zabbix监控Docker容器配置方法 一 检查Zabbix监控平台状态 1 检查Zabbix各组件容器状态 2 奸诈Zabbix server状态 二 下载监控模板 1 进入Zabbix官网下载页面 2 查看下
  • 微信小程序中识别html标签的方法

    rich text组件 在微信小程序中有一个组件rich text可以识别文本节点或是元素节点 具体入下 需要识别的数据放在data中 然后放在nodes属性中即可
  • 编写程序:5类员工有对应封装类,创建Employee数组,若干不同的Employee对象,并实现增删改查功能(《黑马程序员》P144编程题加强版)

    文章目录 Employee类 SalariedEmployee类 HourlyEmployee类 SalesEmployee类 BasePlusSalesEmployee类 Test类 实现增删改查 原题 1 Employee 这是所有员工
  • 【python】深入了解Selenium-PageObject

    1 PageObject 定义 Page Object 简称PO 模式 是Selenium实战中最为流行 并且是自动化测试中最为熟悉和推崇的一种设计模式 在设计自动化测试时 把页面元素和元素的操作方法按照页面抽象出来 分离成一定的对象 然后
  • Sophus使用记录

    sophus库是一个基于Eigen的C 李群李代数库 可以用来方便地进行李群李代数的运算 头文件 主要用到以下两个头文件 include
  • 基于水文规约SL651-2014的“定时报”解析

    一 概述 水文监测数据通信规约SL651 2014规定了水文监测系统中前端传感器与遥测终端以及中心站之间的数据通信协议 本文将以M21F系列RTU为例 详细描述符合SL651 2014数据通信规约标准的遥测站终端与中心站之间的 定时报 报文
  • Go开源库Excelize介绍,电子Excel表格操作强大的库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库 基于 ECMA 376 ISO IEC 29500 国际标准 项目作者是续 日 现任阿里巴巴软件工程师 曾就职百度 奇虎360公司 前百度Go语言编程委员
  • 循环监测b站用户粉丝数、舰长数及增量 程序

    前言 开发语言 python 3 8 功能介绍 循环监测b站用户粉丝数 舰长数及增量 实时打印 并存入数据库中 使用说明 运行 双击运行 bat 输入用户UID 回车 再输入循环周期 回车 即可开始监测 ps 数据存储是sqlite 可以使
  • 如何处理地址不对齐指令?

    连续不断是处理器取指的另一个目标 如果处理器在每一个时钟周期都能取一条指令 就可以源源不断的为处理器提供后续指令流 而不会出现空闲的时钟周期 地址不对齐导致问题 不管是从指令缓存 还是从ITCM中取指令 若处理器遇到了一条地址不对齐的指令
  • H桥L298N两端输出电压不同的原因

    目录 1 问题的证明 2 L298N的原理 3 问题的解决 在做拉力车的时候 电机总是转速不同 起初以为是电机问题 但换成新电机后仍然存在这种问题 又怀疑是导线的问题 因为两电机的导线粗细不同 误以为PWM调速时会被影响 后来锁定问题 就是
  • Leetcode337:打家劫舍 III

    在上次打劫完一条街道之后和一圈房屋后 小偷又发现了一个新的可行窃的地区 这个地区只有一个入口 我们称之为 根 除了 根 之外 每栋房子有且只有一个 父 房子与之相连 一番侦察之后 聪明的小偷意识到 这个地方的所有房屋的排列类似于一棵二叉树
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组