【问题标题】:Finding range in an array在数组中查找范围
【发布时间】:2016-07-05 15:09:26
【问题描述】:

假设我们有一个由这些元素组成的数组(总是排序的)。

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]

我们的目标是找到给定值的最小索引和最大索引,例如假设我们正在搜索元素 3 的 min-index 和 max-index。

我们很快看到,3 的最小索引是 8,最大索引是 11。

对于值 1,最小值为 0,最大值为 3。

您将如何开发一种在 JavaScript 中返回最小值和最大值的解决方案?我试过这样做,但我不知道怎么做,我总是得到错误的答案。

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

你可以试试Array.indexOf()Array.lastIndexOf()

var sortedArr =[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];

console.log(sortedArr.indexOf(1));
console.log(sortedArr.lastIndexOf(1));

【讨论】:

  • 显而易见的答案
【解决方案2】:

基本上Array.indexOf()Array.lastIndexOf() 会这样做,但他们会进行线性搜索(循环遍历整个数组,直到找到元素),这显然是在线性时间O(n) 完成的。

如果你的数组确实总是排序的,那么我们可以使用这个属性来优化它并使用二进制搜索。它更快,并且会在对数时间内完成O(log n)

之后,我们只需检查找到的索引之前(和之后)的元素,直到找到不等于我们的元素的元素。

查找最后一次出现:

var i= foundIndex;
while(sortedArr[i] == sortedArr[foundIndex]){
    i++;
}
foundIndex = i;

第一次出现:

var i= foundIndex;
while(sortedArr[i] == sortedArr[foundIndex]){
    i--;
}
foundIndex = i;

就是这样!这将对运行时间有很大帮助,特别是如果您有大数组。 您可以在任何地方找到二进制搜索实现,只需使用其中任何一个即可。

【讨论】:

    【解决方案3】:

    这是你想要的吗?

    var myarr = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];
    var minNum = myarr[0];
    var maxNum = myarr[1];
    var minNumStartINDX, maxNumStartINDX, minNumEndINDX, maxNumEndINDX;
    /********************************************/
    for (var x = 0; x < myarr.length; ++x) {
      if (minNum >= myarr[x]) {
        minNum = myarr[x];
        minNumEndINDX = x;
      }
    }
    for (var x = 0; x < myarr.length; ++x) {
      if (minNum >= myarr[x]) {
        minNumStartINDX = x;
        break;
      }
    }
    for (var x = 0; x < myarr.length; ++x) {
      if (maxNum <= myarr[x]) {
        maxNum = myarr[x];
        maxNumEndINDX = x;
      }
    }
    for (var x = 0; x < myarr.length; ++x) {
      if (maxNum <= myarr[x]) {
        maxNumStartINDX = x;
        break;
      }
    }
    /********************************************/
    console.log(minNum);
    console.log(minNumStartINDX + "-" + minNumEndINDX);
    console.log(maxNum);
    console.log(maxNumStartINDX + "-" + maxNumEndINDX);

    【讨论】:

      【解决方案4】:
      var data={1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
      var value=3;
      var min=data.length;
      var max=0;
      
      for(var key in data){
         if(data[key]==value){
            if(key<min){
                 min=key;
            }
         if(key > max){
                max=key;
           }
        }
      console.log(min);
      console.log(max);
      

      【讨论】:

      • code var data = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];变量值 = 1; var min = data.length;变量最大值 = 0; for (var key in data) { if (data[key] == value) { if (key max) { max = key; } } } 控制台.log(分钟); console.log(max);
      猜你喜欢
      • 2011-07-21
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多