给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差
示例:
输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}
输出: 3,即数值对(11, 8)
提示:1 <= a.length, b.length <= 100000
-2147483648 <= a[i], b[i] <= 2147483647
正确结果在区间[-2147483648, 2147483647]内
思路
对数组b排序,然后在b中查找a中每个元素的上边界,则上边界索引- 1便是对应的下边界;
然后对上边界在数组的开头和不存在的情况特殊处理
class Solution {
public:
int smallestDifference(vector<int>& a, vector<int>& b) {
// 对数组b排序
sort(b.begin(), b.end());
int sizea= a.size(), sizeb= b.size();
int small= INT_MAX, index= 0;
for(int i= 0; i< sizea; ++i){
// 求a[i]在b中的上边界
auto it= upper_bound(b.begin(), b.end(), a[i]);
// 如果上边界在b的开头或者没有
if(it== b.end()|| it== b.begin()){
// 往前退一个位置
if(it== b.end()) --it;
small= small> abs((long)a[i]- (long)*it)? abs((long)a[i]- (long)*it): small;
continue;
}
// 计算与上边界的差
small= small> abs((long)a[i]- (long)*it)? abs((long)a[i]- (long)*it): small;
// 计算与下边界的差
--it;
small= small> abs((long)a[i]- (long)*it)? abs((long)a[i]- (long)*it): small;
}
return small;
}
};
参考Leetcode题解使用双指针法
class Solution {
public:
int smallestDifference(vector<int>& a, vector<int>& b) {
// 对数组a和b排序
sort(a.begin(), a.end());
sort(b.begin(), b.end());
int small= INT_MAX, indexa= 0, indexb= 0, sizea= a.size(), sizeb= b.size();
long temp;
while(indexa< sizea&& indexb< sizeb){
if(a[indexa]< b[indexb]){
temp= (long)b[indexb]- (long)a[indexa];
small= small> temp? temp: small;
++indexa;
}
else if(a[indexa]> b[indexb]){
temp= (long)a[indexa]- (long)b[indexb];
small= small> temp? temp: small;
++indexb;
}
else return 0;
}
return small;
}
};