最小差
给定两个整数数组(第一个是数组 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; } }
先对数组排序后再求差
对排序后的两个数组,差的绝对值最小是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