本文属于「征服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 <= 91 <= 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)

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& nums1, vector& 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);

}

};

复杂度分析:

时间复杂度:

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) 。仅用到若干额外变量。

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。