1 条题解
-
0
#include<bits/stdc++.h> using namespace std; // arr-存储第一个原始数组,brr-存储第二个原始数组 // arr_u-arr去重排序后数组,brr_u-brr去重排序后数组 // union_arr-存储并集结果,inter_arr-存储交集结果 int arr[1100], brr[1100]; int arr_u[1100], brr_u[1100]; int union_arr[2200], inter_arr[1100]; int main() { // [1] 读取两个原始数组的元素个数m、n int m, n; cin >> m >> n; // [2] 读取第一个数组的m个元素存入arr for (int i = 0; i < m; i++) { cin >> arr[i]; } // [3] 读取第二个数组的n个元素存入brr for (int i = 0; i < n; i++) { cin >> brr[i]; } // [4] 对arr排序并去重,得到去重后数组arr_u,记录其长度m_u sort(arr, arr + m); int m_u = 1; // 初始化去重后长度为1(至少包含第一个元素) arr_u[0] = arr[0]; // 第一个元素直接存入去重数组 for (int i = 1; i < m; i++) { if (arr[i] != arr[i-1]) { // 当前元素与前一个不同,为新元素 arr_u[m_u] = arr[i]; m_u++; // 去重数组长度+1 } } // [5] 对brr排序并去重,得到去重后数组brr_u,记录其长度n_u sort(brr, brr + n); int n_u = 1; // 初始化去重后长度为1 brr_u[0] = brr[0]; // 第一个元素直接存入去重数组 for (int i = 1; i < n; i++) { if (brr[i] != brr[i-1]) { // 当前元素与前一个不同,为新元素 brr_u[n_u] = brr[i]; n_u++; // 去重数组长度+1 } } // [6] 双指针遍历两个去重排序数组,求并集(自动有序、无重复) int i = 0, j = 0, u_len = 0; // i/j-数组指针,u_len-并集数组长度 while (i < m_u && j < n_u) { if (arr_u[i] < brr_u[j]) { // 左数组元素更小,加入并集 union_arr[u_len++] = arr_u[i++]; } else if (arr_u[i] > brr_u[j]) { // 右数组元素更小,加入并集 union_arr[u_len++] = brr_u[j++]; } else { // 两元素相等,仅加入一次(避免重复) union_arr[u_len++] = arr_u[i++]; j++; } } // 处理左数组剩余元素,加入并集 while (i < m_u) union_arr[u_len++] = arr_u[i++]; // 处理右数组剩余元素,加入并集 while (j < n_u) union_arr[u_len++] = brr_u[j++]; // [7] 双指针遍历两个去重排序数组,求交集(自动有序、无重复) i = 0, j = 0; // 重置指针 int i_len = 0; // i_len-交集数组长度 while (i < m_u && j < n_u) { if (arr_u[i] < brr_u[j]) { // 左数组元素更小,指针后移 i++; } else if (arr_u[i] > brr_u[j]) { // 右数组元素更小,指针后移 j++; } else { // 两元素相等,为交集元素,加入交集数组 inter_arr[i_len++] = arr_u[i++]; j++; } } // [8] 输出并集结果,元素间用空格分隔 for (int k = 0; k < u_len; k++) { cout << union_arr[k] << " "; } cout << endl; // 换行分隔并集和交集 // [9] 输出交集结果,元素间用空格分隔 for (int k = 0; k < i_len; k++) { cout << inter_arr[k] << " "; } cout << endl; return 0; }
- 1
信息
- ID
- 1170
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者