Leetcode--最小差

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章