最小差

给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|)。返回最小差。

给定数组 A = [3,4,6,7], B = [2,3,8,9],返回 0

解题

暴力91%数据时候超时

public class Solution {
    /**
     * @param A, B: Two integer arrays.
     * @return: Their smallest difference.
     */
    public int smallestDifference(int[] A, int[] B) {
        // write your code here
        if(A == null || B == null)
            return -1;
        int min = Integer.MAX_VALUE;
        for(int i = 0;i< A.length;i++){
            for(int j = 0;j<B.length;j++){
                int sub = Math.abs(A[i] - B[j]);
                if(min > sub)
                    min = sub;
            }
        }
        return min;
    }
}
View Code

先对数组排序后再求差

对排序后的两个数组,差的绝对值最小是0 ,当是 0 的时候可以直接返回答案

对于其他情况,看上面的公式,同时数组也是排序过的

ai > bj 我们要想减小差的绝对值 必须增加bi的值 j++

ai < bj 我们要想减小差的绝对值 必须增加ai的值 i++

为什么不是减小对于的 i 或j的值 这是因为我们充小开始遍历的

同时我们只遍历两个数组的最小长度,前面部分是两个数组差别最小的,或者只需看短的数组最后一个比较结果就好了。

public class Solution {
    /**
     * @param A, B: Two integer arrays.
     * @return: Their smallest difference.
     */
    public int smallestDifference(int[] A, int[] B) {
        // write your code here
        if(A == null || B == null)
            return -1;
        int min = Integer.MAX_VALUE;
        Arrays.sort(A);
        Arrays.sort(B);
        int i = 0;
        int j = 0;
        while(i< A.length && j<B.length){
            int sub  = Math.abs(A[i] - B[j]);
            min = Math.min(min,sub);
            if(A[i] == B[j]){
                return 0;
            }else if(A[i] >B[j]){
                j++;
            }else if(A[i] < B[j]){
                i++;
            }
        }
        return min;
    }
}

Python

class Solution:
    # @param A, B: Two lists of integer
    # @return: An integer
    def smallestDifference(self, A, B):
        # write your code here
        if A == None or B == None:
            return 0 
        MIN = abs(A[0] - B[0])
        i = 0
        j = 0
        A.sort()  
        B.sort()  
        while i < len(A) and j<len(B):
            sub = abs(A[i] - B[j])
            MIN = min(MIN,sub)
            if MIN == 0:
                return MIN
            elif A[i] >B[j]:
                j+=1
            else:
                i+=1
        return MIN