一.问题描述
Given an array of distinct integers arr
, find all pairs of elements with the minimum absolute difference of any two elements.
Return a list of pairs in ascending order(with respect to pairs), each pair [a, b]
follows
a, b
are fromarr
a < b
b - a
equals to the minimum absolute difference of any two elements inarr
Example 1:
Input: arr = [4,2,1,3]
Output: [[1,2],[2,3],[3,4]]
Explanation: The minimum absolute difference is 1. List all pairs with difference equal to 1 in ascending order.
Example 2:
Input: arr = [1,3,6,10,15]
Output: [[1,3]]
Example 3:
Input: arr = [3,8,-10,23,19,-4,-14,27]
Output: [[-14,-10],[19,23],[23,27]]
Constraints:
2 <= arr.length <= 10^5
-10^6 <= arr[i] <= 10^6
二.解题思路
先注意以下数组里每个元素各不相同
1.首先寻找数组里最小的diff,因此先将数组进行排序,然后一次遍历找到最小的diff
2.由于数组已排好序,因此再遍历一次,比较相邻两个数diff是否等于mindiff,是的话放进结果里
第一步后半步可以和第二步合并
本算法的复杂度为O(nlogn) 为排序的复杂度
如果对自己有求比较严格排序的时候可以不调用库函数,自己实现快排或者分治
更多leetcode算法题解法请关注我的专栏leetcode算法从零到结束或关注我
欢迎大家一起套路一起刷题一起ac
三.源码
给出两个版本,第一版本为不合并,第二个版本为合并,2版本快
class Solution:
def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
arr.sort()
mindiff=2000001 # set the max diff first
rst=[]
for i in range(1,len(arr)): # find the mindiff
if arr[i]-arr[i-1] < mindiff:
mindiff = arr[i]-arr[i-1]
for i in range(1,len(arr)): #find the diff equal to mindiff
if arr[i]-arr[i-1] == mindiff:
rst.append([arr[i-1],arr[i]])
return rst
合并:
class Solution:
def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
arr.sort()
mindiff=2000001 # set the max diff first
rst=[]
for i in range(1,len(arr)):
if arr[i]-arr[i-1] < mindiff:
rst=[]
mindiff = arr[i]-arr[i-1]
rst.append([arr[i-1],arr[i]])
elif arr[i]-arr[i-1] == mindiff:
rst.append([arr[i-1],arr[i]])
return rst