【力扣刷题】1200. 最小绝对差(排序+贪心获取最小差)

205 阅读1分钟

「这是我参与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,32,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];
};

image.png

优化

在上面的解法中,发现我们其实只需要最小的那一组数据,其余的没必要统计,也没必要记录

换个思路,我们定义一个 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;
};

image.png


今天的力扣刷题就分享到这里,感谢大家的阅读~