题解 | #二分查找-I#

二分查找-I

https://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b

问题描述

想象一下,你有一排按大小顺序排列的卡片,每张卡片上有一个数字,而且每个数字都不一样。现在,你需要找到一张特定的卡片。如果找到了这张卡片,你就告诉别人这张卡片的位置;如果没有找到,你就说找不到。

示例

  • 输入:[-1, 0, 3, 4, 6, 10, 13, 14], 13
  • 输出:6
  • 说明:13 出现在卡片中,位置是第 6 张卡片(从 0 开始数)。
  • 输入:[], 3
  • 输出:-1
  • 说明:没有卡片,所以找不到。
  • 输入:[-1, 0, 3, 4, 6, 10, 13, 14], 2
  • 输出:-1
  • 说明:2 这个数字不在卡片中,所以找不到。

解释

  1. 准备阶段:
  2. 把所有的卡片分成两堆:左边一堆和右边一堆。
  3. 最开始,左边堆里包含第一张卡片,右边堆里包含最后一张卡片。
  4. 查找过程:
  5. 找出中间位置的卡片。
  6. 如果中间位置的卡片上的数字正好是你想找的数字,那你就找到了!告诉别人它的位置。
  7. 如果中间位置的卡片上的数字比你要找的数字小,那你就在右边堆里继续找。
  8. 如果中间位置的卡片上的数字比你要找的数字大,那你就在左边堆里继续找。
  9. 重复上面的步骤,直到找到或者确定找不到为止。
  10. 结束:
  11. 如果最后都没有找到,那就告诉别人找不到。

具体步骤

假设我们要找的数字是 13,卡片序列是 [-1, 0, 3, 4, 6, 10, 13, 14]

  1. 准备阶段:
  2. 左边堆包含 -1,右边堆包含 14。
  3. 查找过程:
  4. 中间位置的卡片是 4(位置 3)。
  5. 4 比 13 小,所以我们在右边堆继续找。
  6. 右边堆现在包含 [6, 10, 13, 14]。
  7. 新的中间位置的卡片是 13(位置 6)。
  8. 13 正是我们要找的数字!
  9. 结束:
  10. 我们找到了 13,位置是 6。

Java 实现

下面是具体的 Java 代码实现:

public class BinarySearch {

    // 二分查找
    public static int search(int[] nums, int target) {
        int left = 0; // 左边堆的起始位置
        int right = nums.length - 1; // 右边堆的结束位置

        while (left <= right) { // 只要左边堆的起始位置不大于右边堆的结束位置
            int mid = left + (right - left) / 2; // 计算中间位置

            if (nums[mid] == target) {
                return mid; // 找到了,返回位置
            } else if (nums[mid] < target) {
                left = mid + 1; // 在右边堆继续找
            } else {
                right = mid - 1; // 在左边堆继续找
            }
        }

        return -1; // 没找到
    }

}

示例1

输入:[-1, 0, 3, 4, 6, 10, 13, 14], 13

  • 输出:找到了 13,位置是 6

示例2

输入:[], 3

  • 输出:没有找到 3

示例3

输入:[-1, 0, 3, 4, 6, 10, 13, 14], 2

  • 输出:没有找到 2

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务