时间:1s 空间:256M
题目描述:
给你两个有序的数组。合并这两个数组成为一个新的有序数组,并输出。
输入格式:
第一行输入两个整数n,m
第二行输入n个数,表示第一个有序数组
第三行输入m个数,表示第二个有序数组
输出格式:
输出n+m个数,表示两个数组合并之后的结果。
样例输入:
3 4
4 5 8
1 3 6 7
样例输出:
1 3 4 5 6 7 8
约定:
1<=n<=5000000,1<=m<=5000000,所有的数都在有符号32位整数范围内
提示:
注意数据范围
解析:
可以用类似于归并排序的思想,两数组的“头”依次进行比较,小的进入新数组并在原数组中忽略,大的进行下一轮的比较。这样不断循环,就能实现。具体代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#define N 5000000
using namespace std ;
int a [ N + 1 ] , b [ N + 1 ] , n , m , ans [ 2 * N + 1 ] ;
int main ( )
{
scanf ( "%d %d" , & n , & m ) ;
for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d" , & a [ i ] ) ;
for ( int i = 1 ; i <= m ; i ++ ) scanf ( "%d" , & b [ i ] ) ; //输入两个数组
int i = 0 , j = 0 , k = 0 ;
while ( i + j < n + m )
{
k ++ ;
if ( i + 1 > n ) //检查a数组是否全被放入ans数组中,如果为空,只能用b数组
{
ans [ k ] = b [ j + 1 ] ;
j ++ ;
}
else if ( j + 1 > m ) //和上面一个if同样的道理
{
ans [ k ] = a [ i + 1 ] ;
i ++ ;
}
else if ( a [ i + 1 ] > b [ j + 1 ] ) //这是一般情况的比较
{
ans [ k ] = b [ j + 1 ] ;
j ++ ;
} else
{
ans [ k ] = a [ i + 1 ] ;
i ++ ;
}
}
for ( int i = 1 ; i <= n + m ; i ++ ) printf ( "%d " , ans [ i ] ) ; //输出结果
return 0 ;
}
相关链接:
XJOI 题解小全:
https://blog.csdn.net/zj_mrz/article/details/80949787
XJOI 3287 离散化 题解:
https://blog.csdn.net/zj_mrz/article/details/81037239