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

难度: 简单
来源: 每日一题 2023.09.05

给你两个只包含 19 之间数字的数组 nums1nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。

示例 1:

输入:nums1 = [4,1,3], nums2 = [5,7]
输出:15
解释:数字 15 的数位 1 在 nums1 中出现,数位 5 在 nums2 中出现。15 是我们能得到的最小数字。

示例 2:

输入:nums1 = [3,5,2,6], nums2 = [3,1,7]
输出:3
解释:数字 3 的数位 3 在两个数组中都出现了。

提示:

  • 1 <= nums1.length, nums2.length <= 9
  • 1 <= nums1[i], nums2[i] <= 9
  • 每个数组中,元素 互不相同
class Solution {
    public int minNumber(int[] nums1, int[] nums2) {

    }
}

分析与题解


  • 双指针

    这个题目理解起来非常简单, 我们只需要先排序.

    Arrays.sort(nums1);
    Arrays.sort(nums2);
    

    然后使用双指针移动法进行移动, 如果双指针能找到对应的相等的数字直接返回.

    int index1 = 0, index2 = 0;
    while(index1 < nums1.length && index2 < nums2.length) {
        if (nums1[index1] == nums2[index2]) {
            return nums1[index1];
        } else if (nums1[index1] < nums2[index2]) {
            index1++;
        } else {
            index2++;
        }
    }
    

    如果查找不到, 那就找两个数组开头的数字组成一个较小的双位数返回即可.

    return nums1[0] < nums2[0] ? (nums1[0] * 10 + nums2[0]) : (nums2[0] * 10 + nums1[0]);
    

    整体逻辑代码如下所示.

    class Solution {
        public int minNumber(int[] nums1, int[] nums2) {
            Arrays.sort(nums1);
            Arrays.sort(nums2);
            int index1 = 0, index2 = 0;
            while(index1 < nums1.length && index2 < nums2.length) {
                if (nums1[index1] == nums2[index2]) {
                    return nums1[index1];
                } else if (nums1[index1] < nums2[index2]) {
                    index1++;
                } else {
                    index2++;
                }
            }
            return nums1[0] < nums2[0] ? (nums1[0] * 10 + nums2[0]) : (nums2[0] * 10 + nums1[0]);
        }
    }
    

    复杂度分析:

    • 时间复杂度: O(n), 一次遍历循环, 时间复杂度与较短的数组长度相关.
    • 空间复杂度: O(1), 常量级别的空间复杂度.

    结果如下所示.


IT界无底坑洞栋主 欢迎加Q骚扰:676758285