[leetCode 丶 20241118] 2605. 从两个数字数组里生成最小数字

原题:

https://leetcode.cn/problems/form-smallest-number-from-two-digit-arrays/description/


描述:

给你两个只包含 1 到 9 之间数字的数组 nums1nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。

示例 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 <= 9
  • 1 <= nums1[i], nums2[i] <= 9
  • 每个数组中,元素 互不相同

个人版答案

执行用时: 2 ms 执行内存消耗: 40.55 M

class Solution { public int minNumber(int[] nums1, int[] nums2) { int[] count = new int[9]; for(int i =0; i < nums1.length;i++){ count[nums1[i] - 1] += 1; } for(int i =0; i< nums2.length;i++){ count[nums2[i] - 1] += 1; } int z = 0; for(int i =0; i< count.length;i++){ if(count[i] == 2){ if(z == 0){ z = i+1; } } } if(z > 0){ return z; } int m1 = Arrays.stream(nums1).min().getAsInt(); int m2 = Arrays.stream(nums2).min().getAsInt(); return 10 * Math.min(m1,m2) + Math.max(m1, m2); } }

优秀解法

执行耗时: 0 ms

class Solution { public int minNumber(int[] nums1, int[] nums2) { int i, min=100, min1=10, min2=10, m; int[] a = new int[11]; for(i=0;i<nums1.length;i++) { a[nums1[i]] = 1; if(nums1[i] < min1){ min1 = nums1[i]; } } for(i=0;i<nums2.length;i++) { if(a[nums2[i]] == 1) { if(min > nums2[i]) { min = nums2[i]; } } if(nums2[i] < min2){ min2 = nums2[i]; } } if(min1*10+min2 > min2*10+min1) { m = min2*10+min1; } else { m = min1*10+min2; } if(min>m){ min = m; } return min; } }

个人解题思路与优秀答案解析

题目分析及个人版思路

  1. 秒了...合并排序, 取前两个...
  2. 错了...相同数字当个位数...
  3. 已知大小, 桶排序. 数量大于2则为交集. 拿最小交集
  4. 没有交集则获取各个数组中个最小的值, 两个最小值中的最小值当十位数, 另一个则是个位数...
  5. 没想到这样也会翻车...-_-||

进阶版思路
大合并...天才!!!