本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。
为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。
由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。
给你两个只包含 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
- 每个数组中,元素 互不相同 。
解法1 哈希表+枚举
如果 nums 1 \textit{nums}_1 nums1 与 n u m s 2 nums_2 nums2 有交集,那么答案就是交集的最小值。如果没有交集,设 n u m s 1 nums_1 nums1 的最小值为 x x x , n u m s 2 nums_2 nums2 的最小值为 y y y ,答案就是 min ( 10 x + y , 10 y + x ) \min(10x+y, 10y+x) min(10x+y,10y+x)文章来源:https://uudwc.com/A/nPjY2
class Solution:
def minNumber(self, nums1: List[int], nums2: List[int]) -> int:
s = set(nums1) & set(nums2)
if s: return min(s) # 有交集
x, y = min(nums1), min(nums2)
return min(x * 10 + y, y * 10 + x)
解法2 位运算
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 m = mask1 & mask2;
if (m) return __builtin_ctz(m); // 有交集
int x = __builtin_ctz(mask1), y = __builtin_ctz(mask2);
return min(x * 10 + y, y * 10 + x);
}
};
复杂度分析:文章来源地址https://uudwc.com/A/nPjY2
- 时间复杂度: O ( n + m ) \mathcal{O}(n+m) O(n+m) ,其中 nnn 为 n u m s 1 nums_1 nums1 的长度,mmm 为 n u m s 2 nums_2 nums2 的长度。
- 空间复杂度: O ( 1 ) \mathcal{O}(1) O(1) 。仅用到若干额外变量。