在数组中查找范围
Finding range in an array
让我们假设我们有一个包含这些元素的数组(总是排序的)。
[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
我们的目标是找到给定值的最小索引和最大索引,例如:假设我们正在搜索元素3的最小索引和最大索引。
我们很快看到,3的最小索引是8,最大索引是11。
对于值1,最小值为0,最大值为3。
你会如何开发一个解决方案,返回最小和最大的JavaScript?我试过这样做,但我不知道怎么做,我总是得到错误的答案。
您可以尝试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));
基本上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;
就是这样!这将对运行时有很大帮助,特别是当您有大数组时。你可以在任何地方找到二进制搜索实现,只要使用它们中的任何一个。
这是你想要的吗?
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);
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);
相关文章:
- 正在全局范围中查找JavaScript函数
- 在对象数组中查找多个值的d3范围
- JS:从数组中查找特定范围内的最低/最高数字
- 范围错误与 mongo 进行$near查找
- 查找某个日期范围内的可用天数
- 在日期范围内查找丢失日期的最有效方法是什么
- XML查询日期范围查找
- 在(跨浏览器)JavaScript 中,何时必须在局部范围内缓存变量查找
- 在 d3 中查找多个数据维度的范围
- 与“未定义”进行比较是否仍会进行全局范围查找
- 为什么JavaScript在第二种情况下不查找全局范围
- Keystone.js嵌套承诺 -> foreach -> 列表查找范围问题
- 正则表达式用于在 JavaScript 中查找任何两个数值(范围)之间的所有数字
- 如何在 d3 中查找给定范围内的数据点数
- MongoDB按日期范围查找文档-JavaScript
- Webkit列可查找可见文本的范围
- 查找数组/范围javascript中所有丢失的元素
- 查找符合范围标准的组合
- 在表单选择的日期范围字符串中查找当前日期
- Javascript中的筛选逻辑-在数组中查找值的范围