【力扣每日一题】2023.9.5 从两个数字数组里生成最小数字

文章讲述了如何使用编程方法,通过两个给定的数字数组,以一种特定规则(包含一位数和两位数)组成一个最小的数字,同时考虑了数组排序和使用set或直接遍历的方法。作者提供了两种解决方案并讨论了它们的性能影响。
摘要由CSDN通过智能技术生成

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们两个数字数组,要我们用这两个数组里的元素组成一个数字,这个数字里需要同时拥有两个数组里的至少一个元素。

组成数字有两种情况,一种是只有一位数,另一种是有两位数。

一位数的时候就是两个数组共同拥有同一个元素,那么我们组成的数字就是这个数即可,如果两个数组有多个共同拥有的数字,那么我们取最小的。

两位数的情况是两个数组没有共同拥有相同元素,那么我们要做的就是将两个数组的最小元素分别取出,要组成的数字最小,我们就将较小的数字作为十位数,而较大的数作为个位数。

我们要找出最小数,那么可以直接对每个数组进行一个for循环寻找,不过我们还需要先判断两个数组共同拥有的最小元素是多少,因此我认为对数组进行一个排序操作比较方便。

我实现的手段有两种,一种是用利用set自动对元素排序的特性,另一种是直接对数组进行排序。

如果是用set的话,那么找出两个数组的公共最小元素会方便一些,因为set自带api去寻找某个元素。

如果是直接排序的话,就两层for循环遍历两个数组去寻找公共元素,因为是排过序的,所以找到的第一个元素就是最小的公共元素。

因为测试用例的数据量非常小,所以性能上没有太大差异。

代码:

class Solution {
public:
    int minNumber(vector<int>& nums1, vector<int>& nums2) {
        //利用set
        set<int>s1(nums1.begin(),nums1.end());
        set<int>s2(nums2.begin(),nums2.end());
        //set默认升序排序,从小到大遍历,第一个发现的两个数组都有的元素就是最小的元素,直接返回即可
        for(int num:s1) if(s2.count(num)) return num;
        int n1=*(s1.begin()),n2=*(s2.begin());  //取出两个set的第一个元素,就是两个数组的最小元素
        if(n1>n2) return n2*10+n1;  //将较小的数作为十位数
        return n1*10+n2;

        //直接排序
        sort(nums1.begin(),nums1.end());    //直接对数组排序
        sort(nums2.begin(),nums2.end());
        for(int n1:nums1){
            for(int n2:nums2){
                if(n1==n2) return n1;   //因为排过序了,所以发现有相同的元素返回即可.
            }
        }
        if(nums1[0]>nums2[0]) return nums2[0]*10+nums1[0];  //将较小的数作为十位数
        return nums1[0]*10+nums2[0];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值