LintCode_最小差

问题描述:

给定两个整数数组(第一个是数组 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

算法设计:

方法一:先将A与B从小到大排序,从A的第一个数开始到最后一个数求差值。在每一轮循环中,要先求出A[i]到B[0]的差值,这应该是本轮遍历的最大差值,遇到比这还大的差值,跳出本轮循环:

    public static int smallestDifference2(int[] A, int[] B) {
        if(A==null||B==null||A.length==0||B.length==0){
            return 0;
        }
        
        //先将A,B从小到大排序
        A=Quick(A,0,A.length-1);
        B=Quick(B,0,B.length-1);
        
        //A,B元素的差
        int dif=0;
        //保留最小差值
        int min=abs(A[0],B[0]);
        
       
        
        for(int i=0;i=dif){
                    min=dif;
                }
            }
            if(min>=k){
                min=k;
            }
        }
        return min;
    }
    
    //返回两数的绝对差
    public static int abs(int a,int b){
        
        int num=a-b;
        if(num<0){
            num=num*(-1);
        }
        return num;
    }
    
    public static int[] Quick(int[] numbers,int left,int right){
        
        if(right==left){
            return numbers;
        }
        
        if(numbers==null||numbers.length==0){
            return null;
        }

        int pos=left;
        int j=right;
        int temp=0;
        
        while(jpos&&numbers[pos]>=numbers[j])||(jpos){
                j--;
            }else{
                j++;
            }
            
        }
        
        if(leftpos+1){
            Quick(numbers,pos+1,right);
        }
        
        return numbers;
    }

方法二:刚开始做的时候,没有将A,B排序,直接使用如下代码遍历,导致编译时耗时

for(int i=0;i

方法三:相比于方法一,我们还可以使用二分法缩小循环次数

(1)、首先还是要将A,B进行排序

(2)、从A的第一个数开始到A的最后一个数,循环求最小差值;

(3)、在每一轮循环中,使用二分法找到最小值:begin=A[i]-B[0];end=A[i]-B[B.length-1];mid=A[i]-B[(B.length-1)/2];

(4)、如果min>mid,那么跳到0到(B.length-1)/2中寻找最小差值,否则,在(B.length-1)/2到(B.length-1)中寻找最小差值;



你可能感兴趣的:(学习日志,lintcode)