Determine whether or not there exist two elements in Set S whose sum is exactly x - correct solution?

后端 未结 8 2066
醉梦人生
醉梦人生 2020-12-04 19:48

Taken from Introduction to Algorithms

Describe a Θ(n lg n)-time algorithm that, given a set S of n integers and another integer x, determines whet

8条回答
  •  情深已故
    2020-12-04 20:08

    Here's is an alternate solution, by adding few more conditions into mergesort.

    public static void divide(int array[], int start, int end, int sum) {
    
        if (array.length < 2 || (start >= end)) {
            return;
        }
        int mid = (start + end) >> 1; //[p+r/2]
        //divide
        if (start < end) {
            divide(array, start, mid, sum);
            divide(array, mid + 1, end, sum);
            checkSum(array, start, mid, end, sum);
        }
    }
    
    private static void checkSum(int[] array, int str, int mid, int end, int sum) {
    
        int lsize = mid - str + 1;
        int rsize = end - mid;
        int[] l = new int[lsize]; //init
        int[] r = new int[rsize]; //init
    
        //copy L
        for (int i = str; i <= mid; ++i) {
            l[i-str] = array[i];
        }
        //copy R
        for (int j = mid + 1; j <= end; ++j) {
            r[j - mid - 1] = array[j];
        }
        //SORT MERGE
        int i = 0, j = 0, k=str;
        while ((i < l.length) && (j < r.length) && (k <= end)) {
        //sum-x-in-Set modification
        if(sum == l[i] + r[j]){
            System.out.println("THE SUM CAN BE OBTAINED with the values" + l[i] + " " + r[j]);            
        }
         if (l[i] < r[j]) {
                array[k++] = l[i++];
            } else {
                array[k++] = r[j++];
            }
        }
        //left over
        while (i < l.length && k <= end) {
            array[k++] = l[i++];
              //sum-x-in-Set modification
            for(int x=i+1; x < l.length; ++x){
                if(sum == l[i] + l[x]){
                    System.out.println("THE SUM CAN BE OBTAINED with the values" + l[i] + " " + l[x]);
                }
            }
        }
        while (j < r.length && k <= end) {
            array[k++] = r[j++];
              //sum-x-in-Set modification
            for(int x=j+1; x < r.length; ++x){
                if(sum == r[j] + r[x]){
                    System.out.println("THE SUM CAN BE OBTAINED with the values" + r[j] + " " + r[x]);
                }
            }
        }
    }
    

    But the complexity of this algorithm is still not equal to THETA(nlogn)

提交回复
热议问题