目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目给我们两个数字数组,要我们用这两个数组里的元素组成一个数字,这个数字里需要同时拥有两个数组里的至少一个元素。
组成数字有两种情况,一种是只有一位数,另一种是有两位数。
一位数的时候就是两个数组共同拥有同一个元素,那么我们组成的数字就是这个数即可,如果两个数组有多个共同拥有的数字,那么我们取最小的。
两位数的情况是两个数组没有共同拥有相同元素,那么我们要做的就是将两个数组的最小元素分别取出,要组成的数字最小,我们就将较小的数字作为十位数,而较大的数作为个位数。
我们要找出最小数,那么可以直接对每个数组进行一个for循环寻找,不过我们还需要先判断两个数组共同拥有的最小元素是多少,因此我认为对数组进行一个排序操作比较方便。
我实现的手段有两种,一种是用利用set自动对元素排序的特性,另一种是直接对数组进行排序。
如果是用set的话,那么找出两个数组的公共最小元素会方便一些,因为set自带api去寻找某个元素。
如果是直接排序的话,就两层for循环遍历两个数组去寻找公共元素,因为是排过序的,所以找到的第一个元素就是最小的公共元素。
因为测试用例的数据量非常小,所以性能上没有太大差异。
代码:
class Solution {
public:
int minNumber(vector<int>& nums1, vector<int>& nums2) {
//利用set
set<int>s1(nums1.begin(),nums1.end());
set<int>s2(nums2.begin(),nums2.end());
//set默认升序排序,从小到大遍历,第一个发现的两个数组都有的元素就是最小的元素,直接返回即可
for(int num:s1) if(s2.count(num)) return num;
int n1=*(s1.begin()),n2=*(s2.begin()); //取出两个set的第一个元素,就是两个数组的最小元素
if(n1>n2) return n2*10+n1; //将较小的数作为十位数
return n1*10+n2;
//直接排序
sort(nums1.begin(),nums1.end()); //直接对数组排序
sort(nums2.begin(),nums2.end());
for(int n1:nums1){
for(int n2:nums2){
if(n1==n2) return n1; //因为排过序了,所以发现有相同的元素返回即可.
}
}
if(nums1[0]>nums2[0]) return nums2[0]*10+nums1[0]; //将较小的数作为十位数
return nums1[0]*10+nums2[0];
}
};