LeetCode 2605: Form Smallest Number From Two Digit Arrays (Common Digit / Greedy)
LeetCode 2605ArrayGreedyToday we solve LeetCode 2605 - Form Smallest Number From Two Digit Arrays.
Source: https://leetcode.com/problems/form-smallest-number-from-two-digit-arrays/
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