一、題目描述
二、示例
三、解題思路
先進行一個排序,然後使用雙指針,依次進行比較,將比較的值進行存儲,最小值改變的話,數組置空,最小值改變,如果和最小值相等的話直接push。我剛開始寫的排序是
四、代碼
/**
* @param {number[]} arr
* @return {number[][]}
*/
var minimumAbsDifference = function(arr) {
arr1 = quickSort(arr)
//這裏的排序也可以用sort()但是因爲時間空間複雜度 太高 就用了快排
var arrs = []
var left = 0,right = 1
var min = 999999
while (right < arr.length - 1) {
for (let i = 0; i < arr.length; i++) {
var temp = arr1[right] - arr1[left]
if (temp < min) {
arrs = []
arrs.push([arr1[left], arr1[right]])
min = temp
} else if (temp === min) {
arrs.push([arr1[left], arr1[right]])
}
left++;
right++
}
}
return arrs
};
quickSort = (array) => {
const sort = (arr, left = 0, right = arr.length - 1) => {
if (left >= right) { //如果左邊的索引大於等於右邊的索引說明整理完畢
return
}
let i = left
let j = right
const baseVal = arr[j] // 取無序數組最後一個數爲基準值
while (i < j) { //把所有比基準值小的數放在左邊大的數放在右邊
while (i < j && arr[i] <= baseVal) { //找到一個比基準值大的數交換
i++
}
arr[j] = arr[i] // 將較大的值放在右邊如果沒有比基準值大的數就是將自己賦值給自己(i 等於 j)
while (j > i && arr[j] >= baseVal) { //找到一個比基準值小的數交換
j--
}
arr[i] = arr[j] // 將較小的值放在左邊如果沒有找到比基準值小的數就是將自己賦值給自己(i 等於 j)
}
arr[j] = baseVal // 將基準值放至中央位置完成一次循環(這時候 j 等於 i )
sort(arr, left, j - 1) // 將左邊的無序數組重複上面的操作
sort(arr, j + 1, right) // 將右邊的無序數組重複上面的操作
}
const newArr = array.concat() // 爲了保證這個函數是純函數拷貝一次數組
sort(newArr)
return newArr
}