基于二分查找算法的寻找食物储量

文章介绍了如何用Java实现二分搜索算法,解决在已排序的食物仓库房间中找到满足条件食物数量的问题。
摘要由CSDN通过智能技术生成

寻找食物储量

        你是一个冒险家,在一个危机四伏的森林里,你发现了一个隐藏的食物仓库。这个食物仓库由 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
    }


}

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值