NYOJ 214(LIS,二分插入)_i++NYOJ 214(LIS,二分插入)_插入数据_02View Code


//参考大牛的代码,在stack中插入数据是有序的,而且是进行替换而不需要挪动——也就是说,我

们可以使用二分查找,将每一个数字的插入时间优化到O(logN)
#include<stdio.h>
#define min -32769
int stack[100001];//模拟栈,为了更形象
int main()
{
int T,i,num;int top,low,high,mid;
while(~scanf("%d",&T))
{
top=0;stack[0]=min;
for(i=0;i<T;i++)
{
scanf("%d",&num);
if(num>stack[top])//如果输入进来的数比栈顶的数大,直接插入到栈顶
{
top++;
stack[top]=num;
}
else
{
low=1;high=top;
while(low<=high)/*二分查找,寻找插入位置*/
{
mid=(low+high)/2;
if(num>stack[mid])
{
low=mid+1;
}
else
{
high=mid-1;
}
}
stack[low]=num;//**找到插入位置,并替换点原值**//
}
}
printf("%d\n",top);
}
return 0;
}


作者:​​火星十一郎​

本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.