java通过值和索引搜索数组
我有一个排序的整数数组,我想对其执行搜索。这个数组可以有重复的值如果我搜索一个重复的元素,那么它应该返回该元素的第一个实例的索引
如果我使用Arrays.binarySearch()
,那么它不一定给出所搜索元素的第一个实例的索引。例如here:
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
,它们是排序数组中元素的值,以及数组中元素的索引。重写compareTo
方法以允许Collections.binarySearch()
执行比较。比较可以这样定义:
- 如果当前
value
大于或小于,则顺序由value
决定李> - 如果
value
相同,则使用index
确定顺序李>
我的问题是,这能以一种不那么混乱的方式完成吗?任何较短的都将不胜感激
# 1 楼答案
如果您的问题只是处理数组
A
,您可以使用以下代码找到第一个索引:如果一个数字已经存在,我们不增加
i
的值,因为我们需要重复数字的第一个索引。这样一来,重复数的第一个索引总是保持不变现在要获取索引,我们需要做的就是
hmap.get(24)
# 2 楼答案
只要找到索引并向后搜索,找到第一个,如果它存在的话。这将是
O(log(n) + m)
;其中m
是数组中存在该元素的次数(数组中该元素的重复数)# 3 楼答案
只是一个骇人的解决方案
二进制搜索是查找数字的出现,如果未找到,则返回数字的索引,如果该数字将被添加到排序列表中
# 4 楼答案
看看下面的代码。对原始二进制搜索代码进行了更改:
l
和r
分别是左范围和右范围# 5 楼答案
您可以尝试创建自己的二进制搜索功能,该功能不会停止搜索,除非我们正在搜索的数字第一次出现(之前的数字不同)
试试这个二进制搜索功能:
# 6 楼答案
为什么不充分利用二进制搜索和线性搜索呢?使用二进制搜索来获取数字的一个出现点的索引,然后从那里线性搜索回来,找到第一个出现点: