题目
输入一个排好序的整数数组,找到指定目标数的开始和结束位置。如果指定的数字不在数组中,则输出 [-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) + ']')