寻找食物储量
你是一个冒险家,在一个危机四伏的森林里,你发现了一个隐藏的食物仓库。这个食物仓库由 n 个房间组成,每个房间都有一定数量的食物。你需要找到第一个房间,其中的食物数量大于或等于一个给定的值 x。 这些房间是按食物数量升序排列的。你知道每个房间的食物数量,但由于时间紧迫,你不能一个个房间地去查找。因此,你决定使用二分搜索来快速找到目标房间。 你的任务是编写一个程序,根据每个房间的食物数量和目标值 x,输出第一个食物数量大于或等于 x 的房间的编号。
输入格式:
第一行包含一个整数 n,( 1 ≤ n≤ 10 ^5 ) 表示房间的数量。
第二行包含 n 个整数,表示每个房间的食物数量。这些整数是非降序排列的。
第三行包含一个整数 x,( 1 ≤ x≤ 10 ^9 ) ,表示目标食物数量。
输出格式 :
输出一个整数,表示第一个食物数量大于或等于 x 的房间的编号。如果所有房间的食物数量都小于 x,则输出 −1。
样例输入:
5
2 5 8 10 15
9
样例输出:
4
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
//表示房间的数量
int n=scan.nextInt();
//表示每个房间的食物数量,整数是非降序排序,比将其放入数组中
int[] arr=new int[n];
for(int i=0;i<=n-1;i++){
int n1=scan.nextInt();
arr[i]=n1;
}
//表示目标食物的数量
int x=scan.nextInt();
int index= Search(arr, x);
System.out.println(index);
scan.close();
}
//定义一个二分查找
//房间编号从mid+1开始记录
static int Search(int[] arr,int target){
int low=0;//定义低位下标
int high=arr.length-1;//定义高位下标
while(low<=high){
int mid=(low+high)>>1;//计算中位元素下标
if(target<=arr[mid]){//当目标元素小于中间元素,大于中间元素的前一位元素时,返回中间元素的下标
if(mid==0||arr[mid-1]<target){
return mid+1;
}else{
high=mid-1;//如果不是移动高位下标到目标元素的前一位,直至找到目标值小于或等于中间元素
}
}else{
low=mid+1;
}
}
return -1;//如果所有房间的食物数量都小于目标食物数量返回-1
}
}