基础两数之和
给定递增序列,输出所有和为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(" ");
}
}