029. Minimum-Difference Pairs
Problem
Return all adjacent pairs in a sorted copy whose difference equals the minimum adjacent difference. Inputs are integers and may contain duplicates; repeated adjacent pairs are retained. Output tuples in sorted encounter order. With fewer than two values, return [].
Examples
Example 1
minimum_difference_pairs([4, 2, 1, 3])
=> [(1, 2), (2, 3), (3, 4)]All adjacent gaps tie at one.
Example 2
minimum_difference_pairs([1])
=> []No adjacent edge exists.
Example 3
minimum_difference_pairs([2, 2, 2])
=> [(2, 2), (2, 2)]Two distinct adjacent edges have zero difference.
Reveal the worked solution and reasoning
Why this mechanism works
For sorted values a<=b<=c, the nonadjacent difference c-a is at least either intervening difference. Consequently a globally minimum pair difference appears between neighbors. One pass over those neighbor edges can reset the output when a better gap is found or append when the gap ties.
State and boundaries
gap is the smallest edge difference examined. output contains every examined adjacent pair with that difference.
Protocol
- Sort the values.
- Examine adjacent pairs.
- On a smaller gap replace gap and clear old answers.
- On an equal gap append the pair.
- Return output.
Visualization
sorted: 1--2--3--4
gaps: 1 1 1
all three adjacent pairs qualifyPython implementation
def minimum_difference_pairs(nums):
values = sorted(nums)
gap = float('inf')
output = []
for i in range(1, len(values)):
difference = values[i] - values[i - 1]
if difference < gap:
gap = difference
output = []
if difference == gap:
output.append((values[i - 1], values[i]))
return output
Worked execution
minimum_difference_pairs([4, 2, 1, 3])
L2 minimum_difference_pairs: values = sorted(nums)
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]
L3 minimum_difference_pairs: gap = float('inf')
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=inf
L4 minimum_difference_pairs: output = []
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=inf; output=[]
L5 minimum_difference_pairs: for i in range(1, len(values)):
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=inf; output=[]; i=1
L6 minimum_difference_pairs: difference = values[i] - values[i - 1]
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=inf; output=[]; i=1; difference=1
L8 minimum_difference_pairs: gap = difference
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=1; output=[]; i=1; difference=1
L11 minimum_difference_pairs: output.append((values[i - 1], values[i]))
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=1; output=[(1, 2)]; i=1; difference=1
L5 minimum_difference_pairs: for i in range(1, len(values)):
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=1; output=[(1, 2)]; i=2; difference=1
L11 minimum_difference_pairs: output.append((values[i - 1], values[i]))
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=1; output=[(1, 2), (2, 3)]; i=2; difference=1
L5 minimum_difference_pairs: for i in range(1, len(values)):
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=1; output=[(1, 2), (2, 3)]; i=3; difference=1
L11 minimum_difference_pairs: output.append((values[i - 1], values[i]))
nums=[4, 2, 1, 3]; values=[1, 2, 3, 4]; gap=1; output=[(1, 2), (2, 3), (3, 4)]; i=3; difference=1Result: [(1, 2), (2, 3), (3, 4)]. All adjacent gaps tie at one.
minimum_difference_pairs([1])
L2 minimum_difference_pairs: values = sorted(nums)
nums=[1]; values=[1]
L3 minimum_difference_pairs: gap = float('inf')
nums=[1]; values=[1]; gap=inf
L4 minimum_difference_pairs: output = []
nums=[1]; values=[1]; gap=inf; output=[]Result: []. No adjacent edge exists.
Why the solution is correct
A smaller observed gap invalidates all previous larger-gap answers, while equality adds another valid answer. The neighbor argument ensures that no nonadjacent pair has a smaller difference. The requested adjacent pairs are exactly those retained.
Time and space
O(n log n) time and O(n) space for sorting and output.
Common mistakes
Failing to clear on improvement retains nonminimal pairs. Duplicate values make zero a legitimate minimum difference.
Reasoning card
State: gap is the smallest edge difference examined. output contains every examined adjacent pair with that difference.
Invariant: The best gap seen covers all processed adjacent pairs.
Decision to rehearse: After sorting, only neighbours can realize the minimum gap.
Finish: Return output
Transfer exercise
If the requested output is unique value pairs rather than adjacent occurrences, state how duplicate emission changes.