如果
如果没有交集,设
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)
集合可以用位运算表示,请看:
class Solution {
public int minNumber(int[] nums1, 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 > 0) return Integer.numberOfTrailingZeros(m); // 有交集
int x = Integer.numberOfTrailingZeros(mask1);
int y = Integer.numberOfTrailingZeros(mask2);
return Math.min(x * 10 + y, y * 10 + x);
}
}
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);
}
};
func minNumber(nums1, nums2 []int) int {
var mask1, mask2 uint
for _, x := range nums1 { mask1 |= 1 << x }
for _, x := range nums2 { mask2 |= 1 << x }
if m := mask1 & mask2; m > 0 { // 有交集
return bits.TrailingZeros(m)
}
x, y := bits.TrailingZeros(mask1), bits.TrailingZeros(mask2)
return min(x*10+y, y*10+x)
}
func min(a, b int) int { if b < a { return b }; return a }
- 时间复杂度:$\mathcal{O}(n+m)$,其中
为 的长度,$m$ 为 的长度。 - 空间复杂度:$\mathcal{O}(1)$。仅用到若干额外变量。
欢迎关注 B站@灵茶山艾府