「这是我参与11月更文挑战的第 19 天,活动详情查看:2021最后一次更文挑战」
原题链接
1200. 最小绝对差 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给你个整数数组 arr,其中每个元素都 不相同。
请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
测试用例
示例 1:
输入:arr = [4,2,1,3]
输出:[[1,2],[2,3],[3,4]]
示例 2:
输入:arr = [1,3,6,10,15]
输出:[[1,3]]
参数限制
2 <= arr.length <= 10^5-10^6 <= arr[i] <= 10^6
分析
在一个数组中,需要找出绝对差值最小的数组对
给定一个测试用例 [4,2,1,3] 如果 4,2 组一队,则他的绝对差值就是 2,但是如果 4,3 组一队,那他的差值就是 1
现在 1 就是我们找到的最小差值,那么除了 4,3,我们发现 2,3 和 2,1 他们的最小差值也是 1
在一个数组中,我们需要尽可能的找个各个数之间最小的差值,已知在排序好的数组中,相邻的元素,他们的差值必定是最小值
所以,这题就变成了,需要我们对数组进行排序,然后统计相邻数组之间的差值,并将他们记录下来,最后拿到最小的差值对应的数组对返回,即可。
注意,题目需要我们安装升序的顺序,对数据进行返回
代码
老规矩,引入一个 Object,用他们的差值做 key。吧对应的数组对存入到 key,最后挑出最小 key 返回他的 value
var minimumAbsDifference = function(arr) {
arr.sort((a, b) => a - b);
let obj = {};
for (let i = 0; i < arr.length - 1; i++) {
let diff = arr[i + 1] - arr[i];
let ar = obj[diff] || [];
obj[diff] = ar;
obj[diff].push([arr[i], arr[i + 1]])
}
let min = Object.keys(obj).reduce((a, b) => Math.min(a, b));
return obj[min];
};
优化
在上面的解法中,发现我们其实只需要最小的那一组数据,其余的没必要统计,也没必要记录
换个思路,我们定义一个 min 来标记当前的最小差值,使用 arr 来存储对应差值的数组对;当算出当前相邻数的差值大于 min,则跳过当前循环;等于 min 则存入数组对;小于 min,则更新 min,重置 arr 的数据
var minimumAbsDifference = function(arr) {
arr.sort((a, b) => a - b);
let ar = [
[arr[0], arr[1]]
];
let min = arr[1] - arr[0];
for (let i = 1; i < arr.length - 1; i++) {
let diff = arr[i + 1] - arr[i];
if (diff > min) {
continue;
} else if (diff == min) {
ar.push([arr[i], arr[i + 1]])
} else {
min = diff;
ar = [
[arr[i], arr[i + 1]]
];
}
}
return ar;
};
今天的力扣刷题就分享到这里,感谢大家的阅读~