2605. 从两个数字数组里生成最小数字
难度: 简单
来源: 每日一题 2023.09.05
给你两个只包含 1
到 9
之间数字的数组 nums1
和 nums2
,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。
示例 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), 常量级别的空间复杂度.
结果如下所示.
Comments | 0 条评论