查找一个数字,该数字是已排序数组中其他两个数字的总和

时间:2015-06-17 11:25:36

标签: arrays sorting find sum

正如在主题中所说,我必须检查是否有一个数字是排序数组中其他两个数字的总和。

在问题的第一部分(对于未排序的数组),我写了一个解决方案,只做3个循环并检查所有组合。

现在,我无法理解如何构建最有效的算法来执行相同的操作,但是使用已排序的数组。

数字类型为int(负数或正数),任何数字都可以出现一次以上。

有人可以提供有关逻辑问题的线索吗?

3 个答案:

答案 0 :(得分:0)

我在这里使用C:

n个数字和另一个数字x的数组A []确定S中是否存在两个元素,其总和恰好为x。

方法1(使用排序)

<强>算法:

hasArrayTwoCandidates(A []​​,ar_size,sum) 1)以非递减顺序对数组进行排序。

2)初始化两个索引变量以找到排序数组中的候选元素。

(a)首先初始化到最左边的索引:l = 0

(b)初始化最右边的索引:r = ar_size-1

3)循环,而l <河

(a)如果(A [l] + A [r] == sum)则返回1

(b)如果(A [1] + A [r] <总和)那么l ++

(c)否则r--

4)整个数组中没有候选者 - 返回0

示例: 令数组为{1,4,45,6,10,-8},求和为16

对数组进行排序 A = { - 8,1,4,6,10,45}

初始化l = 0,r = 5

A [1] + A [r]( - 8 + 45)> 16 =&gt;减量r。现在r = 10

A [1] + A [r]( - 8 + 10)&lt; 2 =&gt;增量l。现在l = 1

A [1] + A [r](1 + 10)&lt; 16 =&gt;增量l。现在l = 2

A [1] + A [r](4 + 10)&lt; 14 =&gt;增量l。现在l = 3

A [1] + A [r](6 + 10)== 16 =&gt;找到候选人(返回1)

<强>实施

# include <stdio.h>
# define bool int

void quickSort(int *, int, int);

bool hasArrayTwoCandidates(int A[], int arr_size, int sum)
{
    int l, r;

    /* Sort the elements */
    quickSort(A, 0, arr_size-1);

    /* Now look for the two candidates in the sorted 
       array*/
    l = 0;
    r = arr_size-1; 
    while(l < r)
    {
         if(A[l] + A[r] == sum)
              return 1; 
         else if(A[l] + A[r] < sum)
              l++;
         else // A[i] + A[j] > sum
              r--;
    }    
    return 0;
}

/* Driver program to test above function */
int main()
{
    int A[] = {1, 4, 45, 6, 10, -8};
    int n = 16;
    int arr_size = 6;

    if( hasArrayTwoCandidates(A, arr_size, n))
        printf("Array has two elements with sum 16");
    else
        printf("Array doesn't have two elements with sum 16 ");

    getchar();
    return 0;
}

/* FOLLOWING FUNCTIONS ARE ONLY FOR SORTING 
    PURPOSE */
void exchange(int *a, int *b)
{
    int temp;
    temp = *a;
    *a   = *b;
    *b   = temp;
}

int partition(int A[], int si, int ei)
{
    int x = A[ei];
    int i = (si - 1);
    int j;

    for (j = si; j <= ei - 1; j++)
    {
        if(A[j] <= x)
        {
            i++;
            exchange(&A[i], &A[j]);
        }
    }
    exchange (&A[i + 1], &A[ei]);
    return (i + 1);
}

/* Implementation of Quick Sort
A[] --> Array to be sorted
si  --> Starting index
ei  --> Ending index
*/
void quickSort(int A[], int si, int ei)
{
    int pi;    /* Partitioning index */
    if(si < ei)
    {
        pi = partition(A, si, ei);
        quickSort(A, si, pi - 1);
        quickSort(A, pi + 1, ei);
    }
}

答案 1 :(得分:0)

这个是在Java中使用Hash Set;这是O(n)的复杂性。

rotate_downwards(array + 33, 5);

答案 2 :(得分:0)

执行此操作的有效方法是使用排序,然后使用二进制搜索。

假设两个数字是x和y,x + y = SUM

对于每个x,在数组中搜索元素SUM-x

使用mergesort对数组进行排序。

然后对于数组a中的每个元素a [i],对元素进行二进制搜索(SUM-x) 该算法应该在O(nlgn)中工作。

这里,如果找到,binaryseacrh返回搜索关键字的索引,否则返回-1。 SIZE是数组大小

    for(int i=0;i<SIZE;i++)
      {
        int ind=binarysearch(SUM-a[i]);

        if(ind>0)
          printf("sum=%d + %d\n a[%d] + a[%d]\n"
                    ,a[i],a[ind],i,ind);
      }