LC1200MinimumAbsoluteDifference

Description

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 from arr
  • a < b
  • b - a equals to the minimum absolute difference of any two elements in arr

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 <= 105
-106 <= arr[i] <= 106

Solution

The smallest difference must exist in the difference between two adjacent numbers after sorting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# O(nlogn) time | O(n) space
class Solution:
def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
diff = {}
arr.sort()

for i in range(1, len(arr)):
gap = arr[i] - arr[i-1]
if gap not in diff:
diff[gap] = [[arr[i-1], arr[i]]]
else:
diff[gap].append([arr[i-1], arr[i]])
minKey = float('inf')
ans = []
for key, val in diff.items():
if key < minKey:
minKey= key
ans = val
return ans

Optimize space complexity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# O(nlogn) time | O(1) space
class Solution:
def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
arr.sort()
minDiff = arr[1] - arr[0]
ans = [[arr[0], arr[1]]]

if len(arr) >2:
for i in range(2, len(arr)):
diff = arr[i] - arr[i-1]
if diff < minDiff:
minDiff = diff
ans = [[arr[i-1], arr[i]]]
elif diff == minDiff:
ans.append([arr[i-1], arr[i]])
return ans

#Runtime: 335 ms, faster than 99.47% of Python3 online submissions for Minimum Absolute Difference.
#Memory Usage: 28.8 MB, less than 83.82% of Python3 online submissions for Minimum Absolute Difference.