题目

输入一个排好序的整数数组,找到指定目标数的开始和结束位置。如果指定的数字不在数组中,则输出 [-1,-1]。例如,输入数组为[5, 7, 7, 8, 8, 10], 目标数为8, 输出[3, 4].本题会人工判题,要求时间复杂度O(logn)。

输入描述

输入数据包括两行:
第一行两个整数n(1 ≤ n ≤ 10 ^ 5),和需要查找的数target。
第二行n个整数,范围均在32位整数内,以空格分隔。

输出描述

输出格式为[begin,end],如果不存在就输出[-1,-1]。

示例

输入

6 8
5 7 7 8 8 10

输出

[3,4]

题解

n, k = input().split(' ')
n = int(n)
k = int(k)
array = input().split(' ')
for i in range(n):
    array[i] = int(array[i])

# 方法一:有些地方会超时
# if k not in array:
#     print("[-1,-1]")
# else:
#     start = array.index(k)
#     temp = array[start:]
#     temp = temp[::-1]
#     end = n-1-temp.index(k)
#     print('[' + str(start)+ ',' + str(end) + ']')

# 方法二:二分法
start = 0
end = n - 1
while start < end:
    mid = (start+end) // 2
    if array[mid] >= k:
        end = mid
    else:
        start = mid+1
if array[start] != k:
    print("[-1,-1]")
else:
    res_start = start
    end = n-1
    start = 0
    while start < end:
        mid = (start+end) // 2 + 1
        if array[mid] <= k:
            start = mid
        else:
            end = mid-1
    res_end = start
    print('[' + str(res_start)+ ',' + str(res_end) + ']')