1200-minimum-absolute-difference¶
Try it on leetcode
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, bare fromarra < bb - aequals 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 <= 105-106 <= arr[i] <= 106
Solution(Python)¶
class Solution:
def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
return self.CountingsortedSolution(arr)
# Time Complexity: O(n^2)
# Space COmplexity: O(1)
def naiveSolution(self, arr: List[int]) -> List[List[int]]:
n = len(arr)
result = []
min_diff = inf
for i in range(n):
pair = (i, i)
for j in range(i+1, n):
if i == j:
continue
if arr[j]-arr[i] < min_diff:
min_diff = arr[j]-arr[i]
for i in range(n):
for j in range(i+1, n):
if i == j:
continue
if arr[j]-arr[i] == min_diff:
result.append((arr[i], arr[j]))
return result
# Time Complexity: O(n^logn)
# Space COmplexity: O(1)
def sortedSolution(self, arr: List[int]) -> List[List[int]]:
arr.sort()
result = []
mindiff = inf
n = len(arr)
for i in range(1, n):
curdiff = arr[i] - arr[i-1]
if curdiff < mindiff:
mindiff = curdiff
result = [[arr[i-1], arr[i]]]
elif curdiff == mindiff:
result.append([arr[i-1], arr[i]])
return result
# Time Complexity: O(n+M)
# Space COmplexity: O(M)
def CountingsortedSolution(self, arr: List[int]) -> List[List[int]]:
arr = self.countingSort(arr)
result = []
mindiff = inf
n = len(arr)
for i in range(1, n):
curdiff = arr[i] - arr[i-1]
if curdiff < mindiff:
mindiff = curdiff
result = [[arr[i-1], arr[i]]]
elif curdiff == mindiff:
result.append([arr[i-1], arr[i]])
return result
def countingSort(self, nums):
min_, max_ = min(nums), max(nums)
count = [0] * (max_-min_+1)
for num in nums:
count[num-min_] += 1
result = []
for i, c in enumerate(count):
result.extend([i+min_]*c)
return result