789. 数的范围

题目:

 789. 数的范围 - AcWing题库

 789. 数的范围_第1张图片

思路:二分 

1.确定二分区间--->0~n-1 。

2.找到二分关系,使得二分边界即为所求。

3.注意:若二分右端点更新R=mid,mid=L+R>>1,若二分左端点更新为L=mid,mid=L+R+1。(防止死循环)

代码:

#include
#include
#include
using namespace std;
const int N = 100010;
int arr[N], n, number;
int main()
{
    cin >> n >> number;
    for (int i = 1; i <= n; i++)scanf("%d", &arr[i]);
    while(number--) {
        int x;
        scanf("%d", &x);
        int L = 1, R = n, mid;
        while (L < R) {//判断x左端点
            mid = L + R >> 1;
            if (arr[mid] >= x)R = mid;
            else L = mid + 1;
        }
        if (arr[L] == x) {//若左端点存在,继续判断右端点
            printf("%d ", L);
            R = n;
            while (L < R) {//判断右端点
                mid = L + R + 1 >> 1;
                if (arr[mid] <= x)L = mid;
                else R = mid - 1;
            }
            printf("%d\n", L);
        }
        else//左端点不存在
            printf("-1 -1\n");
    }
    return 0;
}

你可能感兴趣的:(1024程序员节,算法)