zoukankan      html  css  js  c++  java
  • 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

    解题

    暴力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
  • 相关阅读:
    uitoolbar 圆角
    json
    MFC 控件使用笔记
    automake和autoconf使用介绍
    [译]C# Socket连接请求超时机制
    linux 环境变量的配置
    OK6410,修改调试串口,屏蔽调试输出,增加启动画面
    UML图各类符号含义
    图解UML类与类之间的六中关系
    C#综合揭秘——深入分析委托与事件
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5291248.html
Copyright © 2011-2022 走看看