码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2605. 从两个数字数组里生成最小数字


    文章目录

    • Tag
    • 题目来源
    • 题目解读
    • 解题思路
      • 方法一:枚举比较法
      • 方法二:集合的位运算表示法
    • 写在最后

    Tag

    【贪心】【位运算】【数组】【2023-09-05】


    题目来源

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


    题目解读

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


    解题思路

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

    我们先来讲述最小值的计算,方法有很多,可以先升序排序(降序排序)再返回首位置元素(末位置元素),还可以直接使用 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);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    复杂度分析

    时间复杂度: 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);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    复杂度分析

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

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


    写在最后

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

    如果感到有所收获的话可以给博主点一个 👍 哦。

    如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出。💬💬💬

  • 相关阅读:
    自己写并发工具是一种什么体验?
    小程序map组件二——[蓝色波浪篇]引入并配置Vant Weapp(详细)+腾讯地图地点搜索插件获取实时位置实战
    (Matalb分类预测)PSO-BP粒子群算法优化BP神经网络的多维分类预测
    CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?
    模电学习路径
    算法题:21合并两个有序链表
    看好多人都在劝退学计算机,可是张雪峰又 推荐过计算机,所以计算机到底是什么样 的?
    Spring Cloud【SkyWalking服务环境搭建、微服务接入SkyWalking探针、Docker搭建Elasticsearch环境 】(十四)
    一次函数和正比例函数的介绍
    百数助力山西读印:印章定制行业的信息化转型深度解析
  • 原文地址:https://blog.csdn.net/weixin_54383080/article/details/132689516
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号