arrays - 使用二进制搜索的三元组总和

标签 arrays algorithm binary-search

我正在考虑寻找三元组和的各种方法,我遇到了这个 finding a triplet having a given sum .所以我想尝试一下。

My algorithm:
1) Sort the numbers //O(nlogn)
2) Initialize low=0 and high=size-1
3) loop till low<high
   a) if sum-arr[high]-arr[low]< 0 , then decrement high
   b) if third number is not in range of (low,high) then break the loop
   c) else search for third number using binary search

但我没有得到正确的输出。我不知道我的逻辑哪里错了,因为它非常简单的二进制搜索。以下是我已经实现的。 请让我知道我的错误

static boolean isTriplet(int a[], int size, int sum)
    {
       Arrays.sort(a);  //sort the numbers

        int low = 0;
        int high = size-1;
        while(low<high)
        {

            int third = sum - a[high] - a[low];
            if(third<0)
                high--;
            else if(!(sum - a[high] - a[low]>a[low] && sum - a[high] - a[low]< a[high]))  //if the number is not within the range then no need to find the index
                break;
            else
            {
                int index = binarySearch(a,low+1,high-1,third);
                if(index != -1)
                {
                    System.out.println(a[low]+" "+a[index]+" "+a[high]);
                    return true;
                }
                else
                low++;                  

            }

        }
        return false;
    }

我尝试使用输入 {1,2,3,4,5,6} 和 sum=6 但它返回 false 并且当输入为 {3,4,8, 1,2,7,5} 和 sum=20 它返回 true

最佳答案

我部分理解您的想法,但不完全理解。看起来您正在尝试以 O(n log(n)) 时间复杂度解决问题,我不相信这是可能的。我不确定你是如何决定这样做的:

           else
            low++; 

我怀疑在某些情况下你是否应该这样做

high--

那里。我也不确定这段代码:

if(third<0)
   high--;

如果 third > 0,但低于 low 怎么办?

我读了另一个问题,它提出了一个 O(n^2 logn) 解决方案,所以我在这里提供了这样一个解决方案(在 Java 中)。

想法是:用 2 个嵌套的 for 循环 (i, j) 遍历所有元素对并查找第三个元素,该元素将补充数组其余部分中的三元组(该查找使用二进制搜索完成 - while 循环。

public class TripletSum {
    static boolean solve(int[] a, int k) {
        Arrays.sort(a);
        int n = a.length;

        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                int low = j + 1, high = n - 1;

                while(low <= high) {
                    int middle = (low + high) / 2;
                    int sum = a[middle] + a[i] + a[j];
                    if(sum == k) {
                        return true;
                    }
                    if(sum > k) {
                        high = middle - 1;
                    }
                    if(sum < k) {
                        low = middle + 1;
                    }
                }

            }
        }

        return false;
    }

    public static void main(String[] args) {
        int[] a = {1,2,3,4,5,6};

        System.out.println(solve(a, 20));
    } 
}

编辑: 我做了一些研究,但找不到解决此问题的 O(N logN) 解决方案。原来这个问题作为 3SUM 很受欢迎。你可以在Wiki page上看到有一个击败 O(N^2 logN) 的二次解。

关于arrays - 使用二进制搜索的三元组总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145481/

相关文章:

python - 重复二维 NumPy 数组 N 次

arrays - perl文件操作

c - 如何正确地将元素存储在 C 的 char 数组中?

c# - 比较字符串相似度

algorithm - 是否总是可以通过树旋转将一个BST转换为另一个BST?

c - 损坏的二分搜索和冒泡排序

javascript - 如何使用 Promise.all() 推迟返回在函数内部构建的数组?

algorithm - 证明二叉搜索树的中序遍历是有序的(无需归纳)

c - 在 C 中使用 printf 格式化二进制搜索的输出?

python - 如果我需要查找一个值或下一个最高值,我应该使用什么搜索算法?