面试题 16.06. 最小值

LeetCode

面试题 16.06. 最小差

给定两个整数数组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]内

解法:双指针

解题思路:

我们对两个数组进行排序,然后定义两个指针,分别用来扫描两个数组

因为题目要求我们找出最小差,而最小差就是两个数组中最接近的两个数

如:

1 2 3 11 15

8 19 23 127 235

我们知道,最接近8的数字应该是3和11,当a指向11时,b开始向右移动来接近a,所以最接近11的应该是8和19,因此我们按这样的规则扫描

  • 当一个指针指向的数值小于另一个指针指向的数值时,该指针向右移动以接近另一指针指向的数值(因为这样的差值会更小)

代码如下:

class Solution {
    public int smallestDifference(int[] a, int[] b) {
        Arrays.sort(a); //排序两个数组
        Arrays.sort(b);
        int pos1,pos2;
        pos1=pos2=0;
        int res=Integer.MAX_VALUE;
        int max=Integer.MAX_VALUE;
        if(a.length==1 || b.length==1)
        {
            return Math.abs(a[0]-b[0]);
        }
        while(pos10) //差值可能存在在3和11这两个之间
            {
                int d1 = (b[pos2]-a[pos1-1])==max+1?max:Math.abs((b[pos2]-a[pos1-1]));
                int d2 = (a[pos1]-b[pos2])==max+1?max:(Math.abs(a[pos1]-b[pos2]));
                res = Math.min(Math.min(d1, d2), res);
            }
            else
            {
                int d = (a[pos1]-b[pos2])==max+1?max:Math.abs(a[pos1]-b[pos2]);
                res = Math.min(d, res);
            }
            while(b[pos2]<=a[pos1] && pos20)
            {
                int d1 = (a[pos1]-b[pos2-1])==max+1?max:Math.abs((a[pos1]-b[pos2-1]));
                int d2 = (b[pos2]-a[pos1])==max+1?max:Math.abs((b[pos2]-a[pos1]));
                res = Math.min(Math.min(d1, d2), res);
            }
            else
            {
                int d = (b[pos2]-a[pos1])==max+1?max:Math.abs(b[pos2]-a[pos1]);
                res = Math.min(d, res);
            }
        }
        return res;
    }
}

时间复杂度为O(N*log2N), 因为快排的时间复杂度就到达了N*log2N

题目来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/smallest-difference-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(双指针)