算法篇之二分算法

例题1:寻找指定和的整数对

输入n(n<=100,000)个整数,找出其中的两个数,它们之和等于整数m(假定肯定有解)。

/**
找一对数
(1)数组排序
sort()函数用于C++中,对给定区间所有元素进行排序。头文件是#include <algorithm>
(2)二分查找 对每个元素a[i],在数组中二分查找m-a[i],看能否找到 
*/
#include<iostream>
#include<algorithm>
#define maxsize 100001
using namespace std;

/**
二分查找 
*/
int BinarySearch(int a[],int n,int k)
{
	int left=0,right=n-1,flag=0;
	while(left<=right)
	{
		int mid=left+(right-left)/2;
		if(a[mid]==k)
		{
			flag=1;
			break;
		}
		else if(a[mid]>k)
			right=mid-1;
		else 
			left=mid+1;
	}
	return flag;
}
int a[maxsize];
int main()
{
	int n,m,flag=0;
	cin>>n>>m;
	for(int i=0;i<n;i++)
		cin>>a[i];
	sort(a,a+n);
	for(int i=0;i<n;i++)
	{
		int j=m-a[i];
		if(BinarySearch(a,n,j)==1)
		{
			flag=1;
			if(a[i]==j&&a[i]==a[i+1])
			{
				cout<<a[i]<<" "<<j<<endl;
				break;
			}
			if(a[i]>=m/2)
				break;
			cout<<a[i]<<" "<<j<<endl;
		}
	}
	if(flag==0)
		cout<<"No Solution"<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值