arrays - 找到排序数组的索引,使得 a[i]+a[j]=x

标签 arrays algorithm binary-search

这是一道面试题:给定一个整数 x 和一个由 N 个不同整数组成的排序数组 a[],设计一个线性时间算法 来确定是否存在两个不同的索引 i 和 j 使得 a[i] + a[j] == x。不允许辅助存储。 我已经在 Java 中实现了它。但我当前的运行时间是 O(nlogn),因为我在每次迭代 上执行了 binarySearch。所以它不是严格的线性。我想知道是否存在针对此问题的线性时间解决方案。如果是这样,关于它的一些指示可能会有所帮助。

谢谢。

public class SumArrayIndex {

    public static void main(String[] args){

        int[] arr={1,2,3,4,5,6,7,8,9,10};
        sumSortedArray(arr, 4);
        System.out.println();
        sumSortedArray(arr, 19);
        System.out.println();
        sumSortedArray(arr, 100);

    }

    public static void sumSortedArray(int[] arr, int sum){
        for (int i=0;i<arr.length;i++){
            int temp=Arrays.binarySearch(arr, sum-arr[i]);
            if (temp>0 && temp!=i){
                System.out.printf("The two indices are %s and %s%n ",i,temp);
                return;
            }
        }
        System.out.printf("The sum:%s cannot be formed with given array:%s",sum,Arrays.toString(arr));
    }
}

最佳答案

您可以根据以下观察将算法修改为线性时间:

  1. 不失一般性,你可以说ij是这样的 arr[i]<arr[j] .证明:如果不是这样,你可以交换ij .
  2. 考虑到你一开始就开始搜索,当你搜索sum-arr[i] , 您始终可以在索引 i 的右侧搜索;如果sum-arr[i] < arr[i] ,你知道没有答案,因为 j会在 i 的左边
  3. 如果您之前搜索过 sum-arr[i]已在索引 k 处结束如果没有结果,您的下一次搜索可以在索引 i 之间进行和 k .
  4. 您无需搜索 sum-arr[i]使用二进制搜索:你可以从后面进行线性搜索,并保持点 k其中 arr[k] < sum-arr[i]作为您的下一个起点。

这让您可以构建一个算法,对每个项目只检查一次。

关于arrays - 找到排序数组的索引,使得 a[i]+a[j]=x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21687200/

相关文章:

c++ - 数组的指针,那个数组的每个元素的内存空间信息存放在哪里?

c - 使用数组将用户的输入存储到链表中

algorithm - 将数组 2 个元素按 2 个随机洗牌

java - 在java中使用递归进行二分搜索时出现错误的值

python - 二进制搜索算法不起作用

javascript - 内联与可观察数组的绑定(bind)

algorithm - 使用搜索和排序的不相交集

algorithm - 矩形周围的高效凸包(并检查点是否位于包内)

algorithm - 使用 mid=first+(last-first)/2 而不是 (first+last)/2 的效果

javascript - 从数组中获取对象名称