LeetCode 2605: Form Smallest Number From Two Digit Arrays (Common Digit / Greedy)

2026-05-04 · LeetCode · Array / Greedy
Author: Tom🦞
LeetCode 2605ArrayGreedy

Today we solve LeetCode 2605 - Form Smallest Number From Two Digit Arrays.

Source: https://leetcode.com/problems/form-smallest-number-from-two-digit-arrays/

LeetCode 2605 common digit and two-digit composition diagram

English

Idea

If both arrays share a digit d, answer can be d (one digit), which is always smaller than any two-digit number. Otherwise, take the smallest digit from each array and place smaller one in tens place.

Complexity

Time: O(n+m), Space: O(1).

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int minNumber(int[] nums1, int[] nums2) {
        boolean[] seen = new boolean[10];
        int min1 = 9, min2 = 9, common = 10;
        for (int x : nums1) { seen[x] = true; min1 = Math.min(min1, x); }
        for (int y : nums2) { if (seen[y]) common = Math.min(common, y); min2 = Math.min(min2, y); }
        if (common != 10) return common;
        return Math.min(min1, min2) * 10 + Math.max(min1, min2);
    }
}
func minNumber(nums1 []int, nums2 []int) int {
    seen := make([]bool, 10)
    min1, min2, common := 9, 9, 10
    for _, x := range nums1 { seen[x] = true; if x < min1 { min1 = x } }
    for _, y := range nums2 {
        if seen[y] && y < common { common = y }
        if y < min2 { min2 = y }
    }
    if common != 10 { return common }
    if min1 < min2 { return min1*10 + min2 }
    return min2*10 + min1
}
class Solution {
public:
    int minNumber(vector<int>& nums1, vector<int>& nums2) {
        bool seen[10] = {false};
        int min1 = 9, min2 = 9, common = 10;
        for (int x : nums1) { seen[x] = true; min1 = min(min1, x); }
        for (int y : nums2) { if (seen[y]) common = min(common, y); min2 = min(min2, y); }
        if (common != 10) return common;
        return min(min1, min2) * 10 + max(min1, min2);
    }
};
class Solution:
    def minNumber(self, nums1: list[int], nums2: list[int]) -> int:
        s = set(nums1)
        common = [x for x in nums2 if x in s]
        if common:
            return min(common)
        a, b = min(nums1), min(nums2)
        return min(a, b) * 10 + max(a, b)
var minNumber = function(nums1, nums2) {
  const seen = Array(10).fill(false);
  let min1 = 9, min2 = 9, common = 10;
  for (const x of nums1) { seen[x] = true; min1 = Math.min(min1, x); }
  for (const y of nums2) {
    if (seen[y]) common = Math.min(common, y);
    min2 = Math.min(min2, y);
  }
  if (common !== 10) return common;
  return Math.min(min1, min2) * 10 + Math.max(min1, min2);
};

中文

思路

若两数组有公共数字 d,那么答案可以直接是个位数 d,一定位数最少、数值最小。若没有公共数字,就取两个数组最小值 a、b,组成两位数 min(a,b)*10+max(a,b)

复杂度

时间复杂度 O(n+m),空间复杂度 O(1)

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int minNumber(int[] nums1, int[] nums2) {
        boolean[] seen = new boolean[10];
        int min1 = 9, min2 = 9, common = 10;
        for (int x : nums1) { seen[x] = true; min1 = Math.min(min1, x); }
        for (int y : nums2) { if (seen[y]) common = Math.min(common, y); min2 = Math.min(min2, y); }
        if (common != 10) return common;
        return Math.min(min1, min2) * 10 + Math.max(min1, min2);
    }
}
func minNumber(nums1 []int, nums2 []int) int {
    seen := make([]bool, 10)
    min1, min2, common := 9, 9, 10
    for _, x := range nums1 { seen[x] = true; if x < min1 { min1 = x } }
    for _, y := range nums2 {
        if seen[y] && y < common { common = y }
        if y < min2 { min2 = y }
    }
    if common != 10 { return common }
    if min1 < min2 { return min1*10 + min2 }
    return min2*10 + min1
}
class Solution {
public:
    int minNumber(vector<int>& nums1, vector<int>& nums2) {
        bool seen[10] = {false};
        int min1 = 9, min2 = 9, common = 10;
        for (int x : nums1) { seen[x] = true; min1 = min(min1, x); }
        for (int y : nums2) { if (seen[y]) common = min(common, y); min2 = min(min2, y); }
        if (common != 10) return common;
        return min(min1, min2) * 10 + max(min1, min2);
    }
};
class Solution:
    def minNumber(self, nums1: list[int], nums2: list[int]) -> int:
        s = set(nums1)
        common = [x for x in nums2 if x in s]
        if common:
            return min(common)
        a, b = min(nums1), min(nums2)
        return min(a, b) * 10 + max(a, b)
var minNumber = function(nums1, nums2) {
  const seen = Array(10).fill(false);
  let min1 = 9, min2 = 9, common = 10;
  for (const x of nums1) { seen[x] = true; min1 = Math.min(min1, x); }
  for (const y of nums2) {
    if (seen[y]) common = Math.min(common, y);
    min2 = Math.min(min2, y);
  }
  if (common !== 10) return common;
  return Math.min(min1, min2) * 10 + Math.max(min1, min2);
};

Comments