1、知识点
(1)算法思想:利用数据的有序性,通过二分排除,实现快速查找,时间复杂度O(logn)
(2)适用条件:升序或降序序列
(3)二分查找函数:lower_bound()、upper_bound()(假设数组a的长度为n)
2、例题:#11664. 三角形数
//思路:计算每个三角形数,放在t数组中,在t数组中二分查找x-t[i]。
int t[50002];
int main()
{
int x;
cin>>x;
for(int i=1; i<=50000; i++) //计算每个三角形数
{
t[i]=i*(i+1)/2;
}
for(int i=1; i<=50000; i++)
{
int p=lower_bound(t+1,t+50001,x-t[i])-t; //二分查找x-t[i]
if(p<50001&&t[p]==x-t[i])
{
cout<<"YES";
return 0;
}
}
cout<<"NO";
return 0;
}