【欢聚时代】真题-找出指定数在数组中的范围
题目描述
输入一个排好序的整数数组,找到指定目标数的开始和结束位置。
如果指定的数字不在数组中,则输出 [-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
说明
参考解题 C
#include<stdio.h>
int main()
{
int n,target;
while (scanf("%d %d",&n,&target)!=EOF)
{
int i,flag=0,start=-1,end=-1;
int a[100000]={0};
for(i=0;i<n;i++) scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
if(target==a[i]&&flag!=1)
{
start=i;
flag=1;
}
if(target==a[i]&&i!=start) end=i;
}
if(flag==1)
{
printf("[");
if(start!=-1) printf("%d",start);
if(end!=-1) printf(",%d",end);
else printf(",%d",start);
printf("]\n");
}
else printf("[-1,-1]\n");
}
return 0;
}
参考解题 C++
#include<stdio.h>
int main()
{
int n,target;
int a[100000];
int begin,end;
while(scanf("%d%d",&n,&target)==2)
{
begin=end=-1;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
if(target==a[i]&&begin==-1)
begin=end=i;
if(target==a[i]&&begin!=-1)
end=i;
}
printf("[%d,%d]",begin,end);
}
return 0;
}
参考解题 Java
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int target = scan.nextInt();
scan.nextLine();
int[] nums = new int[n];
for(int i=0; i<n; i++){
nums[i] = scan.nextInt();
}
System.out.println("["+searchRange(nums,target)[0]+","+searchRange(nums,target)[1]+"]");
}
public static int[] searchRange(int[] nums, int target) {
int[] ans = {-1,-1};
if(nums == null || nums.length == 0) return ans;
int low = 0, high = nums.length-1;
if(low == high && nums[0] == target) return new int[] {0,0};
while(low < high){
int mid = low + (high-low)/2;
if(nums[mid] < target){
low = mid + 1;
}else{
high = mid;
}
if(low == high && nums[low] == target){
ans[0] = low;
}
}
low = 0; high = nums.length-1;
while(low < high){
int mid = low + (high-low+1)/2;
if(nums[mid] > target){
high = mid - 1;
}else{
low = mid;
}
if(low == high && nums[low] == target){
ans[1] = low;
}
}
return ans;
}
}
参考解题 Python
n,target = list(map(int,input().split()))
s = list(map(int,input().split()))
a = []
for i in range(n):
if s[i] == target:
a.append(i)
if len(a) == 0:
print("[-1,-1]")
else:
print("[%d,%d]"%(a[0],a[-1]))