56
56
57
57
** 方法一:排序**
58
58
59
- 时间复杂度 $O(nlogn)$,其中 $n$ 表示 $arr$ 的长度。
59
+ 根据题目描述,我们需要找出数组 $arr$ 中任意两个元素的最小绝对差,因此我们可以先对数组 $arr$ 排序,随后遍历相邻元素,得到最小绝对差 $mi$。
60
+
61
+ 最后我们再遍历相邻元素,找出所有最小绝对差等于 $mi$ 的元素对。
62
+
63
+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 是数组 $arr$ 的长度。
60
64
61
65
<!-- tabs:start -->
62
66
68
72
class Solution :
69
73
def minimumAbsDifference (self , arr : List[int ]) -> List[List[int ]]:
70
74
arr.sort()
71
- ans = []
72
- mi = inf
73
- for a, b in pairwise(arr):
74
- d = b - a
75
- if d < mi:
76
- ans = [(a, b)]
77
- mi = d
78
- elif d == mi:
79
- ans.append((a, b))
80
- return ans
75
+ mi = min (b - a for a, b in pairwise(arr))
76
+ return [[a, b] for a, b in pairwise(arr) if b - a == mi]
81
77
```
82
78
83
79
### ** Java**
@@ -88,18 +84,15 @@ class Solution:
88
84
class Solution {
89
85
public List<List<Integer > > minimumAbsDifference (int [] arr ) {
90
86
Arrays . sort(arr);
91
- List<List<Integer > > ans = new ArrayList<> ();
92
87
int n = arr. length;
93
- int mi = Integer . MAX_VALUE ;
88
+ int mi = 1 << 30 ;
94
89
for (int i = 0 ; i < n - 1 ; ++ i) {
95
- int a = arr[i], b = arr[i + 1 ];
96
- int d = b - a;
97
- if (d < mi) {
98
- ans. clear();
99
- ans. add(Arrays . asList(a, b));
100
- mi = d;
101
- } else if (d == mi) {
102
- ans. add(Arrays . asList(a, b));
90
+ mi = Math . min(mi, arr[i + 1 ] - arr[i]);
91
+ }
92
+ List<List<Integer > > ans = new ArrayList<> ();
93
+ for (int i = 0 ; i < n - 1 ; ++ i) {
94
+ if (arr[i + 1 ] - arr[i] == mi) {
95
+ ans. add(List . of(arr[i], arr[i + 1 ]));
103
96
}
104
97
}
105
98
return ans;
@@ -114,18 +107,16 @@ class Solution {
114
107
public:
115
108
vector<vector<int >> minimumAbsDifference(vector<int >& arr) {
116
109
sort(arr.begin(), arr.end());
117
- int mi = INT_MAX ;
110
+ int mi = 1 << 30 ;
118
111
int n = arr.size();
112
+ for (int i = 0; i < n - 1; ++i) {
113
+ mi = min(mi, arr[ i + 1] - arr[ i] );
114
+ }
119
115
vector<vector<int >> ans;
120
116
for (int i = 0; i < n - 1; ++i) {
121
- int a = arr[ i] , b = arr[ i + 1] ;
122
- int d = b - a;
123
- if (d < mi) {
124
- mi = d;
125
- ans.clear();
126
- ans.push_back({a, b});
127
- } else if (d == mi)
128
- ans.push_back({a, b});
117
+ if (arr[ i + 1] - arr[ i] == mi) {
118
+ ans.push_back({arr[ i] , arr[ i + 1] });
119
+ }
129
120
}
130
121
return ans;
131
122
}
@@ -135,21 +126,41 @@ public:
135
126
### **Go**
136
127
137
128
```go
138
- func minimumAbsDifference(arr []int) [][]int {
129
+ func minimumAbsDifference(arr []int) (ans [][]int) {
139
130
sort.Ints(arr)
140
- mi := math.MaxInt32
141
- var ans [][]int
142
- for i, a := range arr[:len(arr)-1] {
143
- b := arr[i+1]
144
- d := b - a
145
- if d < mi {
146
- mi = d
147
- ans = [][]int{[]int{a, b}}
148
- } else if d == mi {
149
- ans = append(ans, []int{a, b})
131
+ mi := 1 << 30
132
+ n := len(arr)
133
+ for i := 0; i < n-1; i++ {
134
+ if t := arr[i+1] - arr[i]; t < mi {
135
+ mi = t
150
136
}
151
137
}
152
- return ans
138
+ for i := 0; i < n-1; i++ {
139
+ if arr[i+1]-arr[i] == mi {
140
+ ans = append(ans, []int{arr[i], arr[i+1]})
141
+ }
142
+ }
143
+ return
144
+ }
145
+ ```
146
+
147
+ ### ** TypeScript**
148
+
149
+ ``` ts
150
+ function minimumAbsDifference(arr : number []): number [][] {
151
+ arr .sort ((a , b ) => a - b );
152
+ let mi = 1 << 30 ;
153
+ const n = arr .length ;
154
+ for (let i = 0 ; i < n - 1 ; ++ i ) {
155
+ mi = Math .min (mi , arr [i + 1 ] - arr [i ]);
156
+ }
157
+ const ans: number [][] = [];
158
+ for (let i = 0 ; i < n - 1 ; ++ i ) {
159
+ if (arr [i + 1 ] - arr [i ] === mi ) {
160
+ ans .push ([arr [i ], arr [i + 1 ]]);
161
+ }
162
+ }
163
+ return ans ;
153
164
}
154
165
```
155
166
0 commit comments