給定兩個整數數組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;
}
};