Java 查找边界之间数组中所有整数的最快方法

Java 查找边界之间数组中所有整数的最快方法,java,arrays,algorithm,Java,Arrays,Algorithm,获取数组中2个边界之间的所有值的最快方法是什么。这两个界限都是包容的。在数组中,可以有重复项,在这种情况下,它应该返回所有值 例如,如果我有数组:[1 3 4 6 7 7 8 10]和边界[2,7],程序将返回[3 3 4 6 7] 我知道我可以做一个循环,检查每个元素是否在边界内,但我想知道是否有更快的方法。数组已排序,因此我考虑进行二进制搜索,但我不确定该如何工作 谢谢=0){ 而(index

获取数组中2个边界之间的所有值的最快方法是什么。这两个界限都是包容的。在数组中,可以有重复项,在这种情况下,它应该返回所有

例如,如果我有数组:
[1 3 4 6 7 7 8 10]
和边界
[2,7]
,程序将返回
[3 3 4 6 7]

我知道我可以做一个循环,检查每个元素是否在边界内,但我想知道是否有更快的方法。数组已排序,因此我考虑进行二进制搜索,但我不确定该如何工作


谢谢 您基本上在开始和结束时删除了不需要的数字:

    int[] arr = new int[]{1, 1, 3, 3, 4, 6, 7, 7, 8, 10};
    int low=2;
    int up=7;
    int lowIdx=0;
    int upIdx=arr.length-1;
    for(int i=0;i<arr.length;i++){
        lowIdx = i;
        if(arr[i] >= low){
            break;
        }
    }
    for(int i = arr.length-1;i>=0;i--){
        if(arr[i] <= up){
            break;
        }
        upIdx = i;
    }
    System.out.println(Arrays.toString(Arrays.copyOfRange(arr, lowIdx, upIdx)));
int[]arr=newint[]{1,1,3,3,4,6,7,8,10};
int低=2;
int up=7;
int-lowIdx=0;
int-upIdx=arr.length-1;
对于(int i=0;i


这很容易吗?不太容易。利用数组被排序这一事实,这是一个稍微复杂的代码。

您可以使用
数组。binarySearch(int[],key)
查找高边界元素和低边界元素,无论它们是否存在。
低边界
高边界
,子范围()
方法应该满足您的要求:

/* returns the index first/last occurrence of a value, or one past 
   where the element would have been if missing */
static int indexOf(int array[], int bound, boolean last) {
  int index = Arrays.binarySearch(array, bound);
  if (last && index >= 0) {
    while (index < array.length && array[index] == bound) index++;
  }
  return index < 0 ? -index - 1 : index;
}

static int subRange(int a[], int low, int high) {
  return Arrays.copyOfRange(a, indexOf(a, low, false), indexOf(a, high, true));
}
/*返回索引值的第一次/最后一次出现,或一次过去
如果元素丢失,它会在哪里*/
静态int indexOf(int数组[],int绑定,最后一个布尔值){
int index=Arrays.binarySearch(数组,绑定);
如果(上一个和索引>=0){
而(index
主要的尴尬是处理上界(上界为
last==true
case)由于
binarySearch
返回第一个元素的索引,因此您需要扫描以查找最后一个元素。我很确定其中的某个地方存在一个off by one错误,这让那些不理解就复制它的读者感到惊讶


一个小的额外优化是可能的,因为第二次搜索可以限制在第一次搜索找到的索引右侧的范围内,使用
数组的版本。binarySearch
操作在数组的子范围上。如果您想获得真正的硬核,您可以编写自己的自定义二进制搜索,这需要同时搜索两个元素:在搜索开始时,只要当前中点低于或高于两个元素,就可以几乎免费地缩小两个元素的范围(与单值搜索相比)。一旦
mid
分割了高低键,您就可以使用当前范围作为起点进行单独的二进制搜索。这在
low
high
非常接近时尤其有用:有效地将搜索时间减半。

最简单的方法就是:

int[] arr = {1, 1, 3, 3, 4, 6, 7, 7, 8, 10};
int min = 2;
int max = 7;
int[] result = IntStream.of(arr).filter(x -> x >= min && x <= max).toArray();

有很多方法,时间上的差异会很小,我很困惑…
(int i=lowerBound;i为值或索引指定了边界?使用二进制搜索查找值大于或等于下限的最低索引。再次使用二进制搜索查找值小于或等于上限的最高索引。此问题显示之前的努力完全为零。
        int minIndex = arr.length;
        int maxIndex = 0;
        for(int i = 0; i < arr.length / 2; i++)
        {
            if(arr[i] >= min && i < minIndex)
                minIndex = i;
            int j = arr.length-i-1;
            if(arr[j] <= max && j > maxIndex)
                maxIndex = j;
        }
        int[] res = Arrays.copyOfRange(arr,minIndex,maxIndex+1);