参考博客: 传送门
二分,我认为从二分找数入手十分合适。
首先有一单调序列,如1,3,7,11,15,67,105,156,248,356
下面要找到数字7在哪个位置。
很容易想到,可以直接暴力遍历每一个值,如果数的数量比较少,当然没问题,但是要是有一亿、十亿个数的话,显然时间复杂度为O(n),很容易TLE。
但是二分就能很好地解决时间超限问题。因为它的时间复杂度为O(logn)。
二分的原理也很简单,以上面的找数问题为例,先上代码:
#include<stdio.h>
int p[10] = {1, 3, 7, 11, 15, 67, 105, 156, 248, 356};//一个单调数组
int main()
{
int l = 0, r = 9, mid;
int m = 7;//待查找的数
while (l <= r)
{
mid = (l + r) / 2;
if (p[mid] > m)
r = mid - 1;
else if(p[mid]==m)
break;
else
l = mid + 1;
}
printf("所要查找的数在第%d个\n", mid+1);
return 0;
}