在这个问题中,我们必须找到两个按非降序排序的数组的并集。
#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
,则可以正常工作。所以请告诉我原因
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
循环进行相同的更改。
如果您已到达一个向量的末尾,那么您只想复制另一个向量的其余部分。