给你个整数数组 arr,其中每个元素都 不相同 。
请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
每对元素对 [a,b] 如下:
- a , b均为数组- arr中的元素
- a < b
- b - a等于- arr中任意两个元素的最小绝对差
示例 1:
**输入:** arr = [4,2,1,3]
**输出:** [[1,2],[2,3],[3,4]]
示例 2:
**输入:** arr = [1,3,6,10,15]
**输出:** [[1,3]]
示例 3:
**输入:** arr = [3,8,-10,23,19,-4,-14,27]
**输出:** [[-14,-10],[19,23],[23,27]]
提示:
- 2 <= arr.length <= 10^5
- -10^6 <= arr[i] <= 10^6
方法一:排序 + 一次遍历
思路与算法
首先我们对数组 arr 进行升序排序。这样一来,拥有「最小绝对差」的元素对只能由有序数组中相邻的两个元素构成。
随后我们对数组 arr 进行一次遍历。当遍历到 arr}[i] 和 arr}[i+1] 时,它们的差为 \delta = \textit{arr}[i+1] - \textit{arr}[i]。我们使用一个变量 best 存储当前遇到的最小差,以及一个数组 ans 存储答案:
代码
[sol1-C++]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | class Solution {public:
 vector<vector<int>> minimumAbsDifference(vector<int>& arr) {
 int n = arr.size();
 sort(arr.begin(), arr.end());
 
 int best = INT_MAX;
 vector<vector<int>> ans;
 for (int i = 0; i < n - 1; ++i) {
 if (int delta = arr[i + 1] - arr[i]; delta < best) {
 best = delta;
 ans = { {arr[i], arr[i + 1]} };
 }
 else if (delta == best) {
 ans.emplace_back(initializer_list<int>{arr[i], arr[i + 1]});
 }
 }
 
 return ans;
 }
 };
 
 | 
 [sol1-Java]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | class Solution {public List<List<Integer>> minimumAbsDifference(int[] arr) {
 int n = arr.length;
 Arrays.sort(arr);
 
 int best = Integer.MAX_VALUE;
 List<List<Integer>> ans = new ArrayList<List<Integer>>();
 for (int i = 0; i < n - 1; ++i) {
 int delta = arr[i + 1] - arr[i];
 if (delta < best) {
 best = delta;
 ans.clear();
 List<Integer> pair = new ArrayList<Integer>();
 pair.add(arr[i]);
 pair.add(arr[i + 1]);
 ans.add(pair);
 } else if (delta == best) {
 List<Integer> pair = new ArrayList<Integer>();
 pair.add(arr[i]);
 pair.add(arr[i + 1]);
 ans.add(pair);
 }
 }
 
 return ans;
 }
 }
 
 | 
 [sol1-C#]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | public class Solution {public IList<IList<int>> MinimumAbsDifference(int[] arr) {
 int n = arr.Length;
 Array.Sort(arr);
 
 int best = int.MaxValue;
 IList<IList<int>> ans = new List<IList<int>>();
 for (int i = 0; i < n - 1; ++i) {
 int delta = arr[i + 1] - arr[i];
 if (delta < best) {
 best = delta;
 ans.Clear();
 IList<int> pair = new List<int>();
 pair.Add(arr[i]);
 pair.Add(arr[i + 1]);
 ans.Add(pair);
 } else if (delta == best) {
 IList<int> pair = new List<int>();
 pair.Add(arr[i]);
 pair.Add(arr[i + 1]);
 ans.Add(pair);
 }
 }
 
 return ans;
 }
 }
 
 | 
 [sol1-Python3]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | class Solution:def minimumAbsDifference(self, arr: List[int]) -> List[List[int]]:
 n = len(arr)
 arr.sort()
 
 best, ans = float('inf'), list()
 for i in range(n - 1):
 if (delta := arr[i + 1] - arr[i]) < best:
 best = delta
 ans = [[arr[i], arr[i + 1]]]
 elif delta == best:
 ans.append([arr[i], arr[i + 1]])
 
 return ans
 
 | 
 [sol1-C]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | static inline int cmp(const void *pa, const void *pb) {return *(int *)pa - *(int *)pb;
 }
 
 int** minimumAbsDifference(int* arr, int arrSize, int* returnSize, int** returnColumnSizes){
 qsort(arr, arrSize, sizeof(int), cmp);
 int best = INT_MAX;
 int **ans = (int **)malloc(sizeof(int *) * (arrSize - 1));
 int pos = 0;
 for (int i = 0; i < arrSize - 1; ++i) {
 int delta = arr[i + 1] - arr[i];
 if (delta < best) {
 best = delta;
 for (int j = 0; j < pos; j++) {
 free(ans[j]);
 }
 pos = 0;
 ans[pos] = (int *)malloc(sizeof(int) * 2);
 memcpy(ans[pos], arr + i, sizeof(int) * 2);
 pos++;
 }
 else if (delta == best) {
 ans[pos] = (int *)malloc(sizeof(int) * 2);
 memcpy(ans[pos], arr + i, sizeof(int) * 2);
 pos++;
 }
 }
 *returnSize = pos;
 *returnColumnSizes = (int *)malloc(sizeof(int) * pos);
 for (int i = 0; i < pos; i++) {
 (*returnColumnSizes)[i] = 2;
 }
 return ans;
 }
 
 | 
 [sol1-JavaScript]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | var minimumAbsDifference = function(arr) {const n = arr.length;
 arr.sort((a, b) => a - b);
 
 let best = Number.MAX_VALUE;
 let ans = [];
 for (let i = 0; i < n - 1; ++i) {
 let delta = arr[i + 1] - arr[i];
 if (delta < best) {
 best = delta;
 ans = [];
 const pair = [];
 pair.push(arr[i]);
 pair.push(arr[i + 1]);
 ans.push(pair);
 } else if (delta === best) {
 const pair = [];
 pair.push(arr[i]);
 pair.push(arr[i + 1]);
 ans.push(pair);
 }
 }
 
 return ans;
 };
 
 | 
 [sol1-Golang]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | func minimumAbsDifference(arr []int) (ans [][]int) {sort.Ints(arr)
 for i, best := 0, math.MaxInt32; i < len(arr)-1; i++ {
 if delta := arr[i+1] - arr[i]; delta < best {
 best = delta
 ans = [][]int{ {arr[i], arr[i+1]} }
 } else if delta == best {
 ans = append(ans, []int{arr[i], arr[i+1]})
 }
 }
 return
 }
 
 | 
 复杂度分析