LeetCode刷题记录--面试题 16.06. 最小差

面试题 16.06. 最小差

给定两个整数数组ab,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差

示例:

输入:{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]内

审题:

1、给定正整数数组长度范围[1, 100000]

2、数组每个元素范围[-2147483648,2147483647],因此求2数差值时,使用int会越界,需要转换为long数据类型

3、求2数的最小绝对差,需要用到C库函数,一般会很容易想到使用abs()函数,当请注意abs库函数的原型是

int abs(int n);

根据题意2,abs入参可能会超过int范围,这时一般会报如下错误

Line 19: Char 23: runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself (solution.c)

因此需要使用 labs库函数,原型如下:

long labs( long n );

4、绝对最小差值范围[-2147483648,2147483647],此求最小绝对最下差值初始值可以设置为0x7fffffff

 

解题思路:

1、先对数组进行排序

2、使用“双指针”方法,使2各数组中的元素值逐渐逼近

执行结果:

LeetCode刷题记录--面试题 16.06. 最小差_第1张图片

 

#define MAX 0x7fffffff
int Compare (const void *a, const void *b)
{
    int aa = *(int *)a;
    int bb = *(int *)b;
    if (aa > bb) {
        return 1;
    } else {
        return -1;
    }
}
long Min (long a, long b) 
{
    /*
    if (a < b) {
        return a;
    } else {
        return b;
    }
    */
    return a > b ? b : a;
}
int smallestDifference(int* a, int aSize, int* b, int bSize){
    // 对原数组进行排序,从小到大排序
    qsort(a, aSize, sizeof(int), Compare);
    qsort(b, bSize, sizeof(int), Compare);
    // 初始化待求绝对最小差值
    int minval = MAX;
    // "双指针"
    int i = 0;
    int j = 0;
    while (i < aSize && j < bSize) {
        // 求绝对最小差值,注意使用abs会有越界报错,需使用labs库函数
        long temp = labs((long)a[i] - (long)b[j]);
        // 使用函数调用执行速度更快
        minval = Min(minval, temp);
        // minval = minval > temp ? temp : minval;
        // 逐步逼近2各数组中原始值
        // a数组元素值小于b数组元素值时,a数组右移取较大值(数组从小到大排序)
        // 反之取b数组中较大元素值
        if (a[i] <= b[j]) {
            i++;
        } else {
            j++;
        }
    }
    return minval;
}

 

 

 

你可能感兴趣的:(LeetCode刷题记录--面试题 16.06. 最小差)