我有一个整数排序数组,想要在其上执行搜索。该数组可能具有重复的值。如果我搜索一个重复的元素,则应返回该元素第一次出现的索引。
如果我使用Arrays.binarySearch()
,则不一定会给出搜索元素第一次出现的索引。例如可以看到这里:
int[] A = {10,20,21,24,24,24,24,24,30,40,45} ;
int idx = Arrays.binarySearch(A,24) ;
这里,idx
的值是 5
。我想让它成为 3
。我之前通过创建一个名为 Pair
的类来解决这个问题,代码如下:
class Pair implements Comparable<Pair>
{
int value, index ;
Pair(int v,int i)
{
this.value = v ;
this.index = i ;
}
@Override
public int compareTo(Pair p)
{
if(p.value<this.value)
return 1 ;
else if(p.value>this.value)
return -1 ;
else
{
if(p.index<this.index)
return 1 ;
else if(p.index>this.index)
return -1 ;
else return 0 ;
}
}
}
当使用Collections.binarySearch(new Pair(24,Integer.MIN_VALUE))
(对于一组Pair
)进行搜索时,将返回3
。代码如下:
int[] A = {10,20,21,24,24,24,24,24,30,40,45} ;
List<Pair> L = new ArrayList<Pair>() ;
for(int i=0;i<A.length;i++)
{
L.add(new Pair(A[i],i)) ;
}
int idx = Collections.binarySearch(L,new Pair(24,Integer.MIN_VALUE)) ;
if(idx<0) idx = -idx-1 ;
System.out.println(idx) ;
Pair
的工作方式如下:
它有两个变量value
和index
,分别代表排序数组元素的值和元素在数组中的索引。为了让Collections.binarySearch()
能够进行比较,重写了compareTo
方法。比较可以按照以下方式定义:
- 如果当前
value
大于或小于,则按value
决定顺序。 - 如果
value
相同,则使用index
来决定顺序。
我的问题是,这种方式是否可以更简洁?任何更短的方法都将不胜感激!
for (int i = 0; i < A.length; i++) { hmap.putIfAbsent(A[i], i); }
。但是,你只是迭代数组中的所有元素将它们放入映射表中,然后进行查找。这将是O(n) + O(1) = O(n)
。如果你正在迭代,可以使用简单的if
条件语句来查找;这样你就完全忽略了有序数组的特性。 - Eugene