算法训练篇--数组中两个元素的之间的最小距离

429 阅读1分钟

数组:【1,2,3,4,2,3,2,2】在其中随机选取2个数字,数组中有重复数字 方案:2个,

暴力循环法:对数组进行双重遍历,外层循环找到num1,然后内层循环,num2,找最近的距离,当循环结束时,即可。

function misDistance(arr,num1,num2){ var len = arr.length; if(!arr||len<=0){ return=0 } //找distance var minidis = arr.length-1 dist =0 for(var i=0;i<len;++i){ if(arr[i]==num1){ for(arr[j]==num2){ dist=Math.abs(i-j) if(dist<minidis) miniDIs=dist } }

}

} 因为两次遍历,所以时间复杂度n的2次平方 动态循环法 上述方法1,内层循环对num2的位置进行了很多次重复的查找,。但是,可以采用动态规划的方法把每次遍历的结果都记录下来从而减少遍历次数。 2种情况:1,当遇到num1时,记录下num1值对应的数组下标的位置lastPost1,通过求lastPost1与上次遍历到num2下标的位置lastPost2的差可以求出最近一次遍历到num1与num2的距离 2,当遇到num2,同样记录下它所对应的数组下标的位置lastpost2,然后通过求lastpost2与上次遍历到num1下标位置lastpost1,求最近一次num1和num2的距离。

 解答:function minNum(x,y){
         return(x<y)?x:y
 }
 
function miniDistance(arr,num1,num2){
       var len = arr.length;
       if(!arr|| len<= 0){
          return
       }
       var lastpost1 = -1;
       lastpost2 = -1
       miniDinstance= arr.length;
       for(var i =0;i<len ;++i){
           if(arr[i] == num1){
               lastpost1= i;
               if(lastpost2>0){
                   minidistance = miniNum(miniDinstance,lastPost1-lastpost2)
               }
           }
           if(arr[i] == num2){
               lastpost2= i;
               if(lastpost1>0){
                   minidistance = miniNum(miniDinstance,lastPost2-lastpost1)
               }
           }
       }
       return miniDis
 }