前言
对于这次活动我是很乐意参加的,毕竟自己平常刷题都是刷出来然后提交就行了,对于过程和思路没有用文字来记录和复盘,这次活动可以培养自己一个思考、记录、复盘、优化的习惯。我这个活动的内容应该大部分都是easy,可能会有medium。主要是我太菜了,medium的我都要想好久还不一定对,所以就不写出来献丑了,也希望各位大佬多多包涵。
今天本来已经写过一篇了[LeetCode刷题行动] | 刷题打卡,按照官方的建议最好是一天一篇,但是我在加班啊,后端出问题了,所以这会儿闲着也是闲着,我不接受官方的建议(手动狗头)。
题目描述
给你个整数数组 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进行升序排序,这样方便我们之后的求差排序。然后设置双指针left, right为数组的第一个元素和第二个元素,然后求差值flag,还要设置一个max作为参照物。
用数组的差值flag和max做比较,如果flag小于max就表示这是目前为止差值最小的两个元素,就要将结果数组res置为空,将arr[left]和arr[right]以数组的形式存入res,将flag赋给max等待下一次比较。
如果flag和max相等则继续将arr[left]和arr[right]以数组的形式存入res,注意这一步不需要将res置为空。
然后left++; right++;指针向右移动直到数组末尾,然后返回res。
解题代码
var minimumAbsDifference = function(arr) {
// 数组升序排序
arr.sort((a, b) => a - b)
const n = arr.length
let left = 0, right = 1, res = [], max = Number.MAX_SAFE_INTEGER;
while(right < n) {
const flag = arr[right] - arr[left]
if (flag < max) {
res = []
res.push([arr[left], arr[right]])
max = flag
} else if (flag === max) {
res.push([arr[left], arr[right]])
}
left++;
right++;
}
return res;
}
总结
我用的方法是比较笨的方法,主要是简单易懂,让大家能够看明白,然后可以去根据自己的思路得到自己的解题方法。 就练、就写,先达到无它,唯手熟尔的境界也是很nice的。
加油!好兄弟们!顺手点个赞吧!!!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情