原文:

给定一个arr[],该数组由n个整数组成,任务是从该数组中打印出所有相邻的整数对,这些对在给定数组中出现多次 。 如果数组包含多个这样的对,请按排序顺序打印所有对。

示例

输入arr[] = {1, 2, 5, 1, 2}

输出

1 2

说明

1 2是数组中唯一重复的整数对。

输入arr[] = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2}

输出

1 2 2 3 3 4 4 1

说明

由于数组具有多个重复对,因此所有对均按排序顺序打印。

方法:最简单的方法是遍历数组并将每个相邻对存储在中。 打印频率大于1的所有此类对。 请按照以下步骤解决问题:

  1. 创建一个映射m以将所有相邻对存储在数组中。

  2. 遍历给定数组并将每个相邻对存储在map m中。

  3. 完成上述步骤后,,如果任意一对频率至少为一个,则将其插入向量v中。

  4. ,并打印存储在其中的所有对。

下面是上述方法的实现:

c

// c   program for the above approach 
#include  
using namespace std; 
// function to print adjacent pairs 
// in sorted order 
void repeated_pairs(int arr[], int n) 
{ 
    // store the frequency of all 
    // the adjacent pairs 
    map, int> m; 
    // stores the resultant pairs 
    vector > v; 
    int i, j; 
    // stores the count of all 
    // adjacent pairs 
    for (i = 0; i < n - 1; i  ) { 
        pair p 
            = { arr[i], arr[i   1] }; 
        // increment the count of pair 
        m[p]  ; 
    } 
    // store pairs that appears more 
    // than once 
    for (auto i = m.begin(); 
         i != m.end(); i  ) { 
        // if frequency is at least 1 
        if (i->second > 1) { 
            pair p = i->first; 
            // insert pair into vector 
            v.push_back(p); 
        } 
    } 
    // sort the vector 
    sort(v.begin(), v.end()); 
    // print the pairs 
    for (i = 0; i < v.size(); i  ) { 
        pair p = v[i]; 
        // print the pair 
        cout << p.first << " "
             << p.second << endl; 
    } 
} 
// driver code 
int main() 
{ 
    // given arr[] 
    int arr[] = { 1, 2, 3, 4, 1, 
                  2, 3, 4, 1, 2 }; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    // function call 
    repeated_pairs(arr, n); 
    return 0; 
} 

输出

1 2
2 3
3 4
4 1

时间复杂度o(n * log n)

辅助空间o(n)