本文主要是介绍双指针【1】两数之和基础版 归并排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基础两数之和
给定递增序列,输出所有和为k的种数
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100001;int n,m,k,num1[N],num2[N];
int sum2()
{int i=0,j=n-1,ans=0;while(i<j){if(num1[i]+num1[j]==k) {ans++;i++;j--;}else{if(num1[i]+num1[j]<k) i++;else j--;}}return ans;
}int main()
{//printf("%lf",(double)9/2);scanf("%d",&n);scanf("%d",&k);for(int i=0;i<n;i++) scanf("%d",&num1[i]); printf("%d",sum2());
}
归并排序
需要会写合并两个序列(双指针),上一节试过。
使用递归
这个代码有点问题
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=10001;int n,m,k,num1[N],num2[N],ans[N];
void merge(int a[],int left,int c,int d,int right)
{int i=left;int j=d;int b=0;while(i<=c && j<=right ){if(a[i]<=a[j]){//printf("一%d%d",b,a[i]);ans[b]=a[i];i++;b++;}else{//printf("二%d%d",b,a[j]);ans[b]=a[j];j++;b++;}}
// for(int k=0;k<b;k++)printf("!%d",ans[k]);if(i<=c){for (int k=i;k<=c;k++){ans[b]=a[k];b++;}}else{for(int k=j;k<=right;k++){ans[b]=a[j];b++;}}for (int k=left;k<=right;k++)
{a[k]=ans[k-left];//!!!!!!一开始写的a[k]=ans[k]找了半天错误呜呜呜呜呜呜
//printf("!%d!",a[k]);} //printf("三");
}
void mergesort(int left,int right,int a[])
{
int l=left+(right-left)/2;
if(right>left) {//printf("?");
mergesort(left,l,a);
mergesort(l+1,right,a);
merge(a,left,l,l+1,right);
}}int main()
{//printf("%lf",(double)9/2);
//int num3[]={2,1};
//merge(num3,0,0,1,1);
// for(int i=0;i<5;i++) printf("%d",num3[i]); scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&num1[i]); mergesort(0,n-1,num1);for(int i=0;i<n;i++) {printf("%d",num1[i]); if(i<n-1) printf(" ");}
}
这篇关于双指针【1】两数之和基础版 归并排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!