查找两个已排序数组的并集

问题描述 投票:0回答:1

在这个问题中,我们必须找到两个按非降序排序的数组的并集。

#include<bits/stdc++.h>
using namespace std;
vector<int> findUnion(vector<int>&a,vector<int>&b) {
    vector<int>v;
    int i(0); int j(0);
    while (i<a.size() && j<b.size()) {
        if (a[i]<b[j]) {
            v.push_back(a[i]);
            while (a[i+1]==a[i]) i++;
            i++;
        }
        else if (a[i]>b[j]) {
            v.push_back(b[j]);
            while (b[j+1]==b[j]) j++;
            j++;
        }
        else {
            v.push_back(a[i]);
            while (a[i+1]==a[i]) i++;
            i++;
            while (b[j+1]==b[j]) j++;
            j++;
        }
    }
    if (i<a.size()) {      //I
        v.push_back(a[i]);
        while (a[i+1]==a[i]) i++;
        i++;
    }
    if (j<b.size()) {           //II
        v.push_back(b[j]);
        while (b[j+1]==b[j]) j++;
        j++;
    }
    return v;
}
int main() {
    vector<int>a={1,2,3,4,5,6,7,8,9,10};
    vector<int>b={2,3,4,4,5,11,12};
    vector<int>v=findUnion(a,b);
    for (auto it:v) {
        cout<<it<<" ";
    }
}

我正在

1 2 3 4 5 6 7 8 9 10 11

作为输出而不是:

1 2 3 4 5 6 7 8 9 10 11 12

但是当我更改输入数组

a

a={1,2,3,4,5,6,7,8,9,10,13}

b
保持不变,我得到的输出为

1 2 3 4 5 6 7 8 9 10 11 12 13

这是所需的输出。

所以基本上,如果数组

a
首先耗尽,那么我就不会得到
b
的最后一个元素。如果在注释行 I 和 II 中,将
if
更改为
while
,则可以正常工作。所以请告诉我原因

c++ arrays
1个回答
0
投票
if (i<a.size()) {      //I
    v.push_back(a[i]);
    while (a[i+1]==a[i]) i++;
    i++;
}

应该是

while (i<a.size()) {      //I
    v.push_back(a[i]);
    i++;
}

j
循环进行相同的更改。

如果您已到达一个向量的末尾,那么您只想复制另一个向量的其余部分。

© www.soinside.com 2019 - 2024. All rights reserved.