Leetcode--最小差

本文探讨了在两个整数数组中寻找具有最小差绝对值的一对数值的算法实现,通过对比不同方法,如上界查找和双指针法,详细解析了其背后的逻辑与优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定两个整数数组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;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值