目录
I.合并有序数组
Time Limit:1s Memory Limit: 256M
Description:
Input:
Output:
Sample input:
Sample output:
约束:
思路+代码:
1.暴力法
1.2暴力代码:
2.双指针(归并排序思路)
2.2双指针代码
总结:
题目链接:
I.合并有序数组
Time Limit:1s Memory Limit: 256M
Description:
假设有两个非递增序列 A 与 B ,要求将它们合并为一个非递增序列 C 。
(不可使用任何排序算法完成)
Input:
第一行输入第一个非递增序列,以-1结尾。
第二行输入第二个非递增序列,以-1结尾。
Output:
输出合并后的非递增序列
Sample input:
8 5 4 -1 7 6 3 1 -1
Sample output:
8 7 6 5 4 3 1
约束:
每个序列中元素个数最多不超过100000 ,所有数字都在带符号的 32 位整数范围内(signed 32-bit integers)。
思路+代码:
1.暴力法
我们可以将第二个输入的数组加到第一个输入的数组后面,然后进行从大到小排序,然后遍历输出就可以了,这就是最简单的暴力法!
1.2暴力代码:
#include<bits/stdc++.h>
using namespace std;
int cmp(int a,int b){ //比大小函数
return a>b; //从大到小
}
int main(){
int a[200002]={0},i=1;
while(scanf("%d",&a[i])){ //输入a
if(a[i]==-1)
break;
i++;
}
while(scanf("%d",&a[i])){ //将输入的第二个数组加到a后面
if(a[i]==-1)
break;
i++;
}
sort(a,a+i,cmp); //库函数sort进行从大到小排序
for(int j=0;j<(i-1);j++) //遍历输出
cout<<a[j]<<" ";
return 0;
}
2.双指针(归并排序思路)
我们可以应用归并排序的思路:
利用双指针来进行:
两个指针x,y从0开始,依次来比较a[x]和b[y]的值,如果a[x]>b[y]的话,将a[x]输出,并且将x++,指向a数组中的下一个元素,如果a[x]<b[y]的话,将b[y]输出出去,然后y++,指向b数组中的下一个元素,如果两者相等,就输出同一个数两次,x和y都++;
一直重复到x=a的长度&&y=b的长度,就停止执行,两边的数肯定都输出了,也是按照从大到小输出的!
2.2双指针代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[10001]={0},i=0,b[10001]={0},j=0,x=0,y=0;
while(scanf("%d",&a[i])){ //输入a数组
if(a[i]==-1) //如果是-1就退出
break; //退出
i++; //下标加一
}
while(scanf("%d",&b[j])){ //输入b数组
if(b[j]==-1) //如果是-1就退出
break; //退出
j++; //下标加一
}
while(1){ //双指针循环
if(a[x]>b[y]){ //如果大于
cout<<a[x]<<" "; //输出大的
x++; //将x指向a数组的下一个元素
}
else if(a[x]<b[y]){ //如果小于
cout<<b[y]<<" "; //输出更大的b[y]
y++; //将y指向b数组的下一个元素
}
else{ //如果相等
cout<<a[x]<<" "<<b[y]<<" "; //两者都输出
x++; //将x指向a数组的下一个元素
y++; //将y指向b数组的下一个元素
}
if(x==i&&y==j) //如果长度达到要求
break; //退出
}
return 0;
}
总结:
这道题常人很容易想到暴力sort法,但是那样的话时间复杂度就已经上亿了,是不可能通过的,所以思维需要灵活应用,多多想想:对于数组和字符串来说,双指针是一个很好的优化方法!
题目链接:
https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=1206&pattern=0https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=1206&pattern=0