38
38
39
39
<!-- 这里可写通用的实现逻辑 -->
40
40
41
+ ** 方法一:枚举**
42
+
43
+ 我们观察发现,如果数组 $nums1$ 和 $nums2$ 中有相同的数字,那么相同数字中的最小值一定是最小的数字。否则我们取 $nums1$ 中的数字 $a$ 和 $nums2$ 中的数字 $b$,将 $a$ 和 $b$ 拼接成两个数字,取其中较小的数字即可。
44
+
45
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别是数组 $nums1$ 和 $nums2$ 的长度。
46
+
47
+ ** 方法二:哈希表或数组 + 枚举**
48
+
49
+ 我们可以用哈希表或数组记录数组 $nums1$ 和 $nums2$ 中的数字,然后枚举 $1 \sim 9$,如果 $i$ 在两个数组中都出现了,那么 $i$ 就是最小的数字。否则我们取 $nums1$ 中的数字 $a$ 和 $nums2$ 中的数字 $b$,将 $a$ 和 $b$ 拼接成两个数字,取其中较小的数字即可。
50
+
51
+ 时间复杂度 $(m + n)$,空间复杂度 $O(C)$。其中 $m$ 和 $n$ 分别是数组 $nums1$ 和 $nums2$ 的长度;而 $C$ 是数组 $nums1$ 和 $nums2$ 中数字的范围,本题中 $C = 10$。
52
+
53
+ ** 方法三:位运算**
54
+
55
+ 由于数字的范围是 $1 \sim 9$,我们可以用一个长度为 $10$ 的二进制数来表示数组 $nums1$ 和 $nums2$ 中的数字。我们用 $mask1$ 表示数组 $nums1$ 中的数字,用 $mask2$ 表示数组 $nums2$ 中的数字。
56
+
57
+ 如果 $mask1$ 和 $mask2$ 进行按位与得到的数字 $mask$ 不等于 $0$,那么我们提取 $mask$ 中最后一位 $1$ 所在的位置,即为最小的数字。
58
+
59
+ 否则,我们分别提取 $mask1$ 和 $mask2$ 中最后一位 $1$ 所在的位置,分别记为 $a$ 和 $b$,那么最小的数字就是 $min(a \times 10 + b, b \times 10 + a)$。
60
+
61
+ 时间复杂度 $O(m + n)$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别是数组 $nums1$ 和 $nums2$ 的长度。
62
+
41
63
<!-- tabs:start -->
42
64
43
65
### ** Python3**
@@ -57,6 +79,32 @@ class Solution:
57
79
return ans
58
80
```
59
81
82
+ ``` python
83
+ class Solution :
84
+ def minNumber (self , nums1 : List[int ], nums2 : List[int ]) -> int :
85
+ s = set (nums1) & set (nums2)
86
+ if s:
87
+ return min (s)
88
+ a, b = min (nums1), min (nums2)
89
+ return min (a * 10 + b, b * 10 + a)
90
+ ```
91
+
92
+ ``` python
93
+ class Solution :
94
+ def minNumber (self , nums1 : List[int ], nums2 : List[int ]) -> int :
95
+ mask1 = mask2 = 0
96
+ for x in nums1:
97
+ mask1 |= 1 << x
98
+ for x in nums2:
99
+ mask2 |= 1 << x
100
+ mask = mask1 & mask2
101
+ if mask:
102
+ return (mask & - mask).bit_length() - 1
103
+ a = (mask1 & - mask1).bit_length() - 1
104
+ b = (mask2 & - mask2).bit_length() - 1
105
+ return min (a * 10 + b, b * 10 + a)
106
+ ```
107
+
60
108
### ** Java**
61
109
62
110
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -79,6 +127,55 @@ class Solution {
79
127
}
80
128
```
81
129
130
+ ``` java
131
+ class Solution {
132
+ public int minNumber (int [] nums1 , int [] nums2 ) {
133
+ boolean [] s1 = new boolean [10 ];
134
+ boolean [] s2 = new boolean [10 ];
135
+ for (int x : nums1) {
136
+ s1[x] = true ;
137
+ }
138
+ for (int x : nums2) {
139
+ s2[x] = true ;
140
+ }
141
+ int a = 0 , b = 0 ;
142
+ for (int i = 1 ; i < 10 ; ++ i) {
143
+ if (s1[i] && s2[i]) {
144
+ return i;
145
+ }
146
+ if (a == 0 && s1[i]) {
147
+ a = i;
148
+ }
149
+ if (b == 0 && s2[i]) {
150
+ b = i;
151
+ }
152
+ }
153
+ return Math . min(a * 10 + b, b * 10 + a);
154
+ }
155
+ }
156
+ ```
157
+
158
+ ``` java
159
+ class Solution {
160
+ public int minNumber (int [] nums1 , int [] nums2 ) {
161
+ int mask1 = 0 , mask2 = 0 ;
162
+ for (int x : nums1) {
163
+ mask1 |= 1 << x;
164
+ }
165
+ for (int x : nums2) {
166
+ mask2 |= 1 << x;
167
+ }
168
+ int mask = mask1 & mask2;
169
+ if (mask != 0 ) {
170
+ return Integer . numberOfTrailingZeros(mask);
171
+ }
172
+ int a = Integer . numberOfTrailingZeros(mask1);
173
+ int b = Integer . numberOfTrailingZeros(mask2);
174
+ return Math . min(a * 10 + b, b * 10 + a);
175
+ }
176
+ }
177
+ ```
178
+
82
179
### ** C++**
83
180
84
181
``` cpp
@@ -100,6 +197,57 @@ public:
100
197
};
101
198
```
102
199
200
+ ```cpp
201
+ class Solution {
202
+ public:
203
+ int minNumber(vector<int>& nums1, vector<int>& nums2) {
204
+ bitset<10> s1;
205
+ bitset<10> s2;
206
+ for (int x : nums1) {
207
+ s1[x] = 1;
208
+ }
209
+ for (int x : nums2) {
210
+ s2[x] = 1;
211
+ }
212
+ int a = 0, b = 0;
213
+ for (int i = 1; i < 10; ++i) {
214
+ if (s1[i] && s2[i]) {
215
+ return i;
216
+ }
217
+ if (!a && s1[i]) {
218
+ a = i;
219
+ }
220
+ if (!b && s2[i]) {
221
+ b = i;
222
+ }
223
+ }
224
+ return min(a * 10 + b, b * 10 + a);
225
+ }
226
+ };
227
+ ```
228
+
229
+ ``` cpp
230
+ class Solution {
231
+ public:
232
+ int minNumber(vector<int >& nums1, vector<int >& nums2) {
233
+ int mask1 = 0, mask2 = 0;
234
+ for (int x : nums1) {
235
+ mask1 |= 1 << x;
236
+ }
237
+ for (int x : nums2) {
238
+ mask2 |= 1 << x;
239
+ }
240
+ int mask = mask1 & mask2;
241
+ if (mask) {
242
+ return __ builtin_ctz(mask);
243
+ }
244
+ int a = __ builtin_ctz(mask1);
245
+ int b = __ builtin_ctz(mask2);
246
+ return min(a * 10 + b, b * 10 + a);
247
+ }
248
+ };
249
+ ```
250
+
103
251
### **Go**
104
252
105
253
```go
@@ -125,6 +273,63 @@ func min(a, b int) int {
125
273
}
126
274
```
127
275
276
+ ``` go
277
+ func minNumber (nums1 []int , nums2 []int ) int {
278
+ s1 := [10 ]bool {}
279
+ s2 := [10 ]bool {}
280
+ for _ , x := range nums1 {
281
+ s1[x] = true
282
+ }
283
+ for _ , x := range nums2 {
284
+ s2[x] = true
285
+ }
286
+ a , b := 0 , 0
287
+ for i := 1 ; i < 10 ; i++ {
288
+ if s1[i] && s2[i] {
289
+ return i
290
+ }
291
+ if a == 0 && s1[i] {
292
+ a = i
293
+ }
294
+ if b == 0 && s2[i] {
295
+ b = i
296
+ }
297
+ }
298
+ return min (a*10 +b, b*10 +a)
299
+ }
300
+
301
+ func min (a , b int ) int {
302
+ if a < b {
303
+ return a
304
+ }
305
+ return b
306
+ }
307
+ ```
308
+
309
+ ``` go
310
+ func minNumber (nums1 []int , nums2 []int ) int {
311
+ var mask1 , mask2 uint
312
+ for _ , x := range nums1 {
313
+ mask1 |= 1 << x
314
+ }
315
+ for _ , x := range nums2 {
316
+ mask2 |= 1 << x
317
+ }
318
+ if mask := mask1 & mask2; mask != 0 {
319
+ return bits.TrailingZeros (mask)
320
+ }
321
+ a , b := bits.TrailingZeros (mask1), bits.TrailingZeros (mask2)
322
+ return min (a*10 +b, b*10 +a)
323
+ }
324
+
325
+ func min (a , b int ) int {
326
+ if a < b {
327
+ return a
328
+ }
329
+ return b
330
+ }
331
+ ```
332
+
128
333
### ** ...**
129
334
130
335
```
0 commit comments