[LeetCode解题报告] 面试题 16.06. 最小差

[LeetCode解题报告] 面试题 16.06. 最小差

    • 一、 题目
      • 1. 题目描述
      • 2. 原题链接
    • 二、 解题报告
      • 1. 思路分析
      • 2. 复杂度分析
      • 3. 代码实现
    • 三、 本题小结
    • 四、 参考链接

一、 题目

1. 题目描述

给定两个整数数组ab,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差

示例:

输入:{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
  • 正确结果在区间 [0, 2147483647]
Related Topics
  • 数组

2. 原题链接

链接: 面试题 16.06. 最小差

二、 解题报告

1. 思路分析

题意很清楚,找最小差,可以转化成:
对a中每个数,找b中最接近它的数。
这样想的话,把b排序,然后二分即可。
实际上把a也排序的话,可以同向双指针,两个指针都往前爬靠近对方即可,类似归并。

  • 本题求min,兄弟题求max: 475. 供暖器
    [LeetCode解题报告] 面试题 16.06. 最小差_第1张图片

2. 复杂度分析

最坏时间复杂度O(nlog2n+mlog2m+n+m) = O(nlog2n+mlog2m)

3. 代码实现

排序+双指针

class Solution:
    def smallestDifference(self, a: List[int], b: List[int]) -> int:
        a.sort()
        b.sort()
        m,n = len(a) ,len(b)
        ans = 2**32
        i=j=0
        while i < m and j < n:
            ans = min(ans,abs(a[i]-b[j]))
            if a[i] < b[j]:
                i += 1
            elif b[j] < a[i]:
                j += 1
            else:
                return 0
        return ans

三、 本题小结

  1. 灵活运用双指针,可以在很多地方优化成O(n)

四、 参考链接

  • 链接: 475. 供暖器

你可能感兴趣的:(今天开刷leetcode,英雄星球六月集训,leetcode,算法,数据结构)