我有一个排序的整数数组,可以是负数:
[ -30, -13, -10, -4, -1, 4, 23, 55, 90, 234, 433, 500 ]
我需要找到大于或等于零的最小数字的索引以及小于或等于400的最大数字。
最有效的方法是什么?
(我使用的是JavaScript,但任何语言或伪代码都没问题)
答案 0 :(得分:1)
O(log N)
JSFiddle:http://jsfiddle.net/vCY68/
function binaryIndexOf(data, criteria) {
'use strict';
var minIndex = 0;
var maxIndex = data.length - 1;
var currentIndex;
var currentElement;
var result = null;
while (minIndex <= maxIndex) {
currentIndex = (minIndex + maxIndex) / 2 | 0;
currentElement = data[currentIndex];
var comparison = criteria(currentElement);
if (comparison[0] == 'right') {
minIndex = currentIndex + 1;
} else {
maxIndex = currentIndex - 1;
}
if (comparison[1]) {
result = currentIndex;
}
}
return result;
}
var firstPositive = binaryIndexOf(data, function(value) {
return value < 0 ? ['right', false] : ['left', true];
});
var lastLess400 = binaryIndexOf(data, function(value) {
return value > 400 ? ['left', false] : ['right', true];
});
比较函数返回2个值:1st是比较后的移动位置。第二个是当前值是否可以接受。
PS:为了节省实施二进制搜索的时间,我们采用http://oli.me.uk/2013/06/08/searching-javascript-arrays-with-a-binary-search/的代码进行了一些修改
PPS:如果手动初始化搜索范围并使用firstPositive + 1
起始索引参数化第二次搜索
答案 1 :(得分:0)
在数组中进行二进制搜索0和400。如果你达到0或400那么这就是答案,否则检查你到达的数组元素以及左边或右边的元素,看看哪一个最大小于0或最大小于400.复杂性是O( log n)如果你的数组大小为n。
答案 2 :(得分:0)
二进制搜索大于0的最低元素以及数组中大于400的最高元素。
如果索引旁边的元素仍然在减少或增加,您需要在搜索中稍作修改以检查每次。例如:如果你达到值3而前一个元素是-2,则3将是你的答案(即不是比较你正在搜索下一个最高或最低值的相等性)
您需要2 O(logn)操作才能实现此目的。