码迷,mamicode.com
首页 > Web开发 > 详细

每周一题:最小绝对差(更新JS)

时间:2020-05-22 21:15:05      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:需要   就是   意义   color   ret   利用   turn   变量   为什么   

题目:

给一个整数数组 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)

标签:需要   就是   意义   color   ret   利用   turn   变量   为什么   

原文地址:https://www.cnblogs.com/sayg-1207/p/12919414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!