每周一题:最小绝对差(更新JS)
Posted 沈卢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周一题:最小绝对差(更新JS)相关的知识,希望对你有一定的参考价值。
题目:
给一个整数数组 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
通过率:
解题代码:
var minimumAbsDifference = function(arr) {
var len=arr.length;//取数组的长度
arr=arr.sort((a,b)=>a-b);
let minVal=arr[len-1];//设定一个最小值作为参考,在此将它设置为数组里最大的那个元素
let result=[];//建立数组存放元素相减得到的差
let poor=0;//存放元素相减得到的差
for(let i=0;i<len;i++){
poor=arr[i+1]-arr[i];
if(poor<minVal){
minVal=poor;
}
}
for(let j=1;j<len;j++){
if((arr[j]-arr[j-1])==minVal){
result.push([arr[j-1],arr[j]]);
}
}
return result;
};
思路:
首先观题,题目需要我们找出数组元素两两相减最小的绝对差,所以这里需要我们在计算后进行比较所有差的大小,所以我们需要建立一个空数组用来存放这些差值。在建立空数组之后,我们再来考虑如何求得数组元素差值。
由于并没有确定数组内部元素如何排列,升序还是降序,又或者是随意排列都没有给出,而我们需要包含全部的情况,所以需要对数组重新进行排序。在这里我们使用js里面的sort()函数对数组进行重新排序,变成一个升序数组。然后我们写一个for循环,再设置一个变量用来存放最初始的数据差值,然后进行数组遍历,依次将相邻两位做减法,将得到的差值与最初的差值进行比较。假如新的差值小于最初的差值则进行替换,得到最小的那个差值,以不断循环找到数组内两个元素相减能够得到的最小值,然后退出循环,进入一个新的循环。
值得注意的是,我们在开始第一个循环之前要记得设置一个最小值,在这里我将最小值设定为了数组内最大的那个数,这样每次元素相减时都可以进行替换,我们设置成别的数值也可以,但一定要保证它能够经过轮换变为最小值,否则这个遍历的数值就没有意义了。
利用第一个for循环找出后我们需要找出相减结果为这个最小值的两个元素了,因为已经将arr数组重新排序过,所以这里直接用if进行判断,满足条件就将这两个元素用push方法加进我们事先建立好的空数组中去,然后继续循环。知道循环完数组,最后输出用来存放这些数据的数组。因为能够得到最小值的搭配很可能不止一种,所以我们需要考虑更多的搭配情况。
在这里我写的代码其实还是漏掉了一种情况,那就是当数组arr为空或者长度为1时应该直接返回空值,但题目间没有做出要求,给出的示例中也没有专门挑出这种。我自己在控制台输入空数组或者是长度为1的数组进行了测试,也能得出符合的结果。
这个提交得到的结果并不是十分好,执行用时耗费太长,但是当我将第一个循环的条件进行细微改动,变成下面这样时:
var minimumAbsDifference = function(arr) {
var len=arr.length;
arr=arr.sort((a,b)=>a-b);
let minVal=arr[len-1];
let result=[];
let poor=0;
for(let i=0;i<len;++i){
poor=arr[i]-arr[i-1];
if(poor<minVal){
minVal=poor;
}
}
for(let j=1;j<len;j++){
if((arr[j]-arr[j-1])==minVal){
result.push([arr[j-1],arr[j]]);
}
}
return result;
};
执行结果变成了下面这样:
经过对比可以看出来我只改动过标红的两个地方。
这里主要是由于i++和++i导致循环语句的难易程度不同,从自身来看,++i 和 i++都 等同于 i = i + 1;但是一般情况下,它们都是跟赋值联系在一起。++ i是将自身的值赋给变量,之后自身再加1;i++ 是将自身+1 后的值赋给变量,同时自身加1;也就是说这两种代码,一种i=0,一种i=1。它们进行循环时的数值是不一样的,这也是为什么一个是i-(i-1)一个是(i+1)-i了。
以上是关于每周一题:最小绝对差(更新JS)的主要内容,如果未能解决你的问题,请参考以下文章