首页 > 其他 > 详细

已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j]

时间:2014-03-11 02:26:52      阅读:672      评论:0      收藏:0      [点我收藏+]

方法一:枚举法。该方法是最容易、也是最简单的方法,枚举出数组A和数组B中所有的元素对,判断其和是否为c,如果是,则输出。

方法二:排序+二分查找法。首先,对两个数组中长度较大数组,不妨设为A,排序;然后,对于B中每个元素B[i]在A中二分查找c-B[i],如果找到,直接输出。

方法三:排序+线性扫描法。首先,对A和B进行排序;然后用指针p从头扫描A,用指针q从尾扫描B,如果A[p]+B[q]==c,则输出A[p]+B[q],且p++,q--;如果A[p]+B[q]>c,则q--;否则p++。
    代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "stdafx.h"
#include <stdio.h>
void sortArray(int a[], int n)
{
    if (a == NULL || n <= 0)
        printf("数组中无元素,排个毛啊。");
    else
    {
        int temp;
        for (int i = 0; i < n-1; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (a[i]>a[j])
                {
                    a[i] = a[i] ^ a[j];
                    a[j] = a[j] ^ a[i];
                    a[i] = a[i] ^ a[j];
                }
            }
        }
    }
}
void findCouple(int a[], int b[], int An, int Bn,int sum)
{
    if (a == NULL || An <= 0 || b == NULL || Bn <= 0)
        printf("数组中无元素,找个毛啊。");
    else
    {
        for (int i = 0, j = Bn - 1; i < An, j >= 0;)
        {
            if (a[i] + b[j]>sum)
                j--;
            if (a[i] + b[j] == sum)
            {
                printf("%d,%d\n", a[i], b[j]);
                i++;
                j--;
            }
            if (a[i] + b[j] < sum)
                i++;
        }
    }
}
void main()
{
    int a[] = {1,3,1,5,2,0};
    int b[] = { 1, 4, 3, 1, 0, 1 };
    int An = sizeof(a) / sizeof(int);
    int Bn = sizeof(b) / sizeof(int);
    sortArray(a, An);
    sortArray(b, Bn);
    findCouple(a, b, An, Bn, 6);
    getchar();
}

  效果如图:

bubuko.com,布布扣

    方法四:Hash法。首先,将两个数组中长度较小的数组,不妨设为A,保存到哈希表中,然后,对于B中每个元素B[i],也采用相同的hash算法在哈希表中查找c-B[i]是否存在,如果存在,则输出.时间复杂度为O(m+n),空间复杂度为O(min{m,n})。但这种算法有个问题,就是会出现重复。

    代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;
void print_pairs_with_sum2(int A[], int B[], int m, int n, int sum)
{
    map<int, bool> hash_table;
    int *psmaller = A;
    int *pbigger = B;
    int nsmaller = (m >= n) ? n : m;
    int nbigger = (m >= n) ? m : n;
    if (m > n)
    {
        psmaller = B;
        pbigger = A;
    }
    for (int i = 0; i < nsmaller; i++)
    {
        hash_table.insert(pair<int, bool>(psmaller[i], true));
    }
    for (int i = 0; i < nbigger; i++)
    {
        if (hash_table.find(sum - pbigger[i])!= hash_table.end())
        {
            cout << "(" << pbigger[i] << "," << sum - pbigger[i] << ")" << endl;
        }
    }
}
void main()
{
    int a[] = { 1, 5, 4, 3, 2, 0 };
    int b[] = { 1, 4, 3, 1, 0, 1 ,};
    int m = sizeof(a) / sizeof(int);
    int n = sizeof(b) / sizeof(int);
    print_pairs_with_sum2(a, b, m, n, 6);
    getchar();
}

  效果如图:

bubuko.com,布布扣

已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j],布布扣,bubuko.com

已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j]

原文:http://www.cnblogs.com/cysolo/p/3591994.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!