【问题标题】:Minumum distance between two numers in Array using Javascript使用Javascript的数组中两个数字之间的最小距离
【发布时间】:2017-05-17 17:14:33
【问题描述】:

我正在寻找一种更好的解决方案来获得数组中 2 个元素之间的最小距离。 输入:arr[] = {3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3}, x = 3, y = 6 输出:3 和 6 之间的最小距离为 4。

我在 JS 中有这段代码,它现在可以正常工作。 我正在寻找更好的代码来实现相同的目标。 谢谢!!

<script>
var numbers= ["2", "3", "5","7","1","2","3","4","8"];
var x ="5";
var y ="8";
var firstIndex = numbers.indexOf(x);

var minD = numbers.length;

var x= numbers.forEach(function(item,index){

if((item == x) || (item == y))
{
    if((index != firstIndex) && (index-firstIndex < minD))
    {
    minD = index-firstIndex;
    firstIndex = index;
    }
    else
    {
    firstIndex = index;
    }
 }

});
alert(minD);

document.getElementById("demo").innerHTML = minD;
</script>

【问题讨论】:

  • 什么是“更好”?
  • 什么是cars

标签: javascript arrays


【解决方案1】:
var xs=array.reduce((arr,el,i)=>(!(el===x)||arr.push(i),arr),[]);
var ys=array.reduce((arr,el,i)=>(!(el===y)||arr.push(i),arr),[]);
var lowest= xs.map(ix=>ys.map(iy=>Math.abs(iy-ix)).sort()[0]).sort()[0];

我不确定这是否真的更短或更好,只是另一种方法......

我只是过滤掉所有的 x 和 y 位置,然后计算它们之间的距离 (iy-ix) 并取最小值 (.sort()[0])

http://jsbin.com/nolohezape/edit?console

【讨论】:

  • @aakriti1711 这在两个方向上都有效,而下面的 Ninas 代码仅从左到右工作。然而,她的速度要快得多。请考虑哪个更适合您并勾选绿色复选标记...
【解决方案2】:

您可以通过测试实际差异是否更小来保留索引并优化最小值。

function getMinDistance(array, left, right) {
    var rightIndex, leftIndex, minDistance;
    array.forEach(function (a, i) {
        if (a === left && (leftIndex === undefined || leftIndex < i)) {
            leftIndex = i;
        }
        if (a === right && leftIndex !== undefined) {
            rightIndex = i;
        }
        if (leftIndex < rightIndex && (minDistance === undefined || minDistance > rightIndex - leftIndex)) {
            minDistance = rightIndex - leftIndex;
        }
    });
    return minDistance
}

console.log(getMinDistance(["2", "3", "5", "7", "1", "2", "3", "4", "8"], "5", "8"));
console.log(getMinDistance([3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3], 3,  6));

【讨论】:

    【解决方案3】:

     
    function findMin(arr,a,b){
    	var firstIndex = arr.indexOf(a);
      console.log(firstIndex);
      
      var lastIndex = arr.indexOf(b);
      console.log(lastIndex);
      
      var minDistance;
      
      if(firstIndex===lastIndex){
      		minDistance = 1;
      }
      if(firstIndex<lastIndex){
      		minDistance = lastIndex-firstIndex;
      }
    	return minDistance;
    }
    
     console.log(findMin([1,2,3,4,5,6],1,5));

    【讨论】:

      【解决方案4】:

      假设数组可能非常大,我宁愿在迭代之前不要sort,因为这不是一个有效的策略。

      下面的逻辑从左到右扫描数组,所以在每次迭代中,用?标记的数字与所有进行中的数字进行检查,直到找到最佳匹配,然后同样发生宽度下一个数字,直到计算出所有可能性并保存最佳(最低)结果 (minDis)。

       ?  -  -   -   -   -  ?
      [50, 5, 75, 66, 32, 4, 58] // diff between 50 and each number past it (min is 8)
      
           ? -   -   -  ?  -
      [50, 5, 75, 66, 32, 4, 58] // diff between 5 and each number past it (min is 1)
      
              ?  ?  -   -   -
      [50, 5, 75, 66, 32, 4, 58] // diff between 75 and each number past it (min is 9)
      ...
      

      在递归的每次迭代中,minDis 参数被发送到更深的级别,因此该级别的本地差异(for 循环)与 minDis 参数进行比较,如果差异较小,然后将其设置为“新”minDis 值:

      var data = [50, 5, 75, 66, 32, 4, 58]; // assume a very large array
      
      // find the minimum distance between two numbers
      function findMinDistance(arr, minDis = Infinity, idx = 0){ 
        for( var numIdx = idx; numIdx < arr.length; numIdx++ ){
          var diff = Math.abs(arr[idx] - arr[numIdx+1])
          if( diff < minDis ) minDis = diff
          // no need to continue scanning, since "0" is the minimum possible
          if( minDis === 0 ) return 0
        }
        
        // scan from left to right, so each item is compared to the ones past it
        return idx < arr.length - 1 && minDis > 0 
          ? findMinDistance(arr, minDis, idx+1) 
          : minDis
      }
      
      console.log(`Min distance is: ${findMinDistance(data)}`)

      一种非递归方法,类似于上述:

      var data = [50, 5, 75, 66, 32, 4, 58]; // assume a very large array
      
      // find the minimum distance between two numbers
      function findMinDistance(arr){
        var minDis = Infinity, idx = 0, numIdx = idx
        
        for( ; numIdx < arr.length; numIdx++ ){
          var diff = Math.abs(arr[idx] - arr[numIdx+1])
          
          // if result is lower than minDis, save new minDis
          if( diff < minDis ) 
            minDis = diff 
          
          // "0" is the minimum so no need to continue
          if( minDis === 0 ) 
            return 0 
          
          // go to the next number and compare it to all from its right
          else if( numIdx == arr.length - 1 ) 
            numIdx = ++idx
        }
      
        return minDis
      }
      
      console.log(`min distance is: ${findMinDistance(data)}`)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 1970-01-01
        • 2021-01-30
        • 1970-01-01
        相关资源
        最近更新 更多