二分
我认为从二分找数入手十分合适。
首先有一单调序列,如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;
}
代码思路:首先初始化l为左边界,r为右边界,然后进入循环,当满足l<r时退出循环。每次循环开始,mid赋值为左边界和右边界的中点,将p[mid]与所要查找的值m对比,若p[mid]<m,则将左边界l移动到mid+1的位置,否则将右边界r移动到mid-1的位置,如此循环。