public int BinarySearchLeft<T>(IList<T> array,T element)
where T : IComparable
{
int lo = 0;
int hi = array.Count();
while (lo < hi)
{
int mid = (lo+hi) / 2;
if (array[mid].CompareTo(element) < 0)
lo = mid + 1;
else
hi = mid;
}
return lo;
}
,
如果遍历一次,则可以创建一个辅助数组来阻止遍历该项目!这个想法很简单-
-
找到键后,将其标记为遍历(这样,如果第二次获得相同的项目,则可以识别出是否遍历了相同的索引项,因此可以使用dfs):布尔数组。并继续这样做,直到获得不是您的“钥匙”的物品;
1.1如果找到了该项目,请检查当前索引是否小于或小于先前找到的索引(对于最左边的索引),如果是,则将其替换为当前索引。
1.2如果找到了该项目,请检查当前索引是否大于或等于先前找到的索引(对于正确的索引)(如果是),将其替换为当前索引。
-
对其余项目使用常规的二进制搜索算法。
遍历整个数组后,将返回最左边和最右边的索引对。
在这里,是上述方法的实现:[在Java中]
public class LeftRightMostOcc {
static class Pair{
int left,right;
// initial value for left and right pair
public void setLeftMostPair() {
this.left = Integer.MAX_VALUE;
}
public void setRightMostPair() {
this.right = Integer.MIN_VALUE;
}
}
private static Pair binarySearchUtil(int [] a,int key,int low,int high,boolean [] visited,Pair obj) {
if(high >= low) {
int middle = low + ((high-low)/2);
// found key,and not visited before
if(a[middle] == key && !visited[middle]) {
// update if less value you get,for left pair
if(middle < obj.left)
obj.left = middle;
// update if right value you get,for right pair
if(middle > obj.right)
obj.right = middle;
// mark the index
visited[middle] = true;
// keep on doing this,until you get an item which is not your "key"
Pair flag = binarySearchUtil(a,key,low,middle-1,visited,obj);
if(flag != null)
flag = binarySearchUtil(a,middle+1,high,obj);
}
// apply regular binary search algo for the rest of the item.
else if(a[middle] > key) {
return binarySearchUtil(a,obj);
}
else {
return binarySearchUtil(a,obj);
}
}
return obj;
}
private static Pair binarySearch(int [] a,int high) {
boolean [] visited = new boolean[a.length];
Pair object = new Pair();
object.setLeftMostPair();
object.setRightMostPair();
return binarySearchUtil(a,object);
}
public static void main(String[] args) {
int [] a = {1,1,2,3,4,5,5};
Pair object = binarySearch(a,a.length-1);
System.out.println("LeftMost Index: "+object.left+" - RightMost Index: "+object.right);
}
}
O / P:LeftMost指数:3-RightMost指数:6 [对于键-2]
O / P:LeftMost指数:10-RightMost指数:10 [对于键-4]
O / P:LeftMost指数:11-RightMost指数:14 [对于键-5]
,
您可以通过提供修改的键比较函数来解决此问题,如果两个被比较元素相等并且与前一个元素的比较也返回相等,则返回值更大。这样,只有运行的第一个元素将返回等于。
这有点做作,可以更好地实现您自己的搜索功能。
本文链接:https://www.f2er.com/3111228.html