来源:力扣 (LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一、题目描述
给定一个 n 个元素有序的 (升序) 整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回-1 。
示例 1:
- 输入:nums = [-1,0,3,5,9,12], target = 9
- 输出:4
- 解释:9 出现在 nums 中并且下标为 4
示例 2:
- 输入:nums = [-1,0,3,5,9,12], target = 2
- 输出:-1
- 解释:2 不存在 nums 中因此返回 -1
提示:
- 你可以假设
nums中的所有元素是不重复的。 n将在[1, 10000]之间。nums的每个元素都将在[-9999, 9999]之间。
二、二分查找
二分查找的前提要求是数组有序,一趟二分查找的算法描述为:
- 确定数组上下边界,然后取中间值 mid 。
- 对比中间值 mid 和目标值 target,此时有两种情况:
- 如果 target 小于 mid,说明目标值在下边界区,继续在下半边界执行步骤 1 。
- 如果 target 大于 mid,说明目标值在上边界区,继续在上半边界执行步骤 1 。
- 如果上下边界一直找完都没有找到目标值,说明数组中不存在指定数据。
图文描述
在数组 [2, 3, 4, 5, 6, 7, 8] 中查找 3 。第一步,计算 mid 是下标为 3 的值 5,此时 5 比目标值 3 要大,说明 3 出现在 5 左边,要在 [low, mid) 进行下一步查找:
![[leetcode]704-二分查找-图片1](https://www.dyxmq.cn/wp-content/uploads/2020/02/3f229-image4d7f5fcd65024b40.png)
第二步,重新定位修改区域,查找的下标范围是 [0, 2] 。此时 mid 计算出来等于 1,下标等于 1 的元素值为 3,刚好就是我们要找的目标值,查找完成:
![[leetcode]704-二分查找-图片2](https://www.dyxmq.cn/wp-content/uploads/2020/02/cf540-image31fb070d0bc528a8.png)
三、代码
需要注意的点已经在代码中标出:
- 注意有符号、无符号以及数据是否会溢出。当前题目中数据不大,所以直接使用 int 。
- 循环结束的条件是
low > high,所以循环条件一定是low <= high,不要少了等于符号。 - 没有找到目标值的时候,返回-1 。
这么简单的一个题目,提交了 4 次才通过。。。。基础很重要!!!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/* * 二分查找法法 * @nums 数组 * @target 待查找的目标元素 * @return 找到返回数组下标,没找到返回-1 */ int search(vector<int> &nums, int target) { // [1] 注意数据溢出 int low, high, mid; low = 0; high = nums.size() - 1; // [2] 判断条件是小于等于,而不是小于 while (low <= high) { mid = (low + high) / 2; if (target < nums[mid]) { high = mid - 1; } else if (target > nums[mid]) { low = mid + 1; } else { return mid; } } // [3] 没找到默认返回-1 return -1; } |
![[leetcode]704-二分查找-图片3](https://www.dyxmq.cn/wp-content/uploads/2020/02/3bf22-imagef2946ecda0e78ffe.png)
![[leetcode]1030-距离顺序排列矩阵单元格](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/02/d43fb-imagea0be8088e44c8b7a.png&w=280&h=210&a=&zc=1)
![[leetcode]7-整数反转](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/02/e23c0-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]460-LFU缓存](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/04/5b3f2-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]876-链表的中间节点](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/64d0d-imagece778ab033c9d90d.png&w=280&h=210&a=&zc=1)

![[leetcode]199-二叉树的右视图](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/04/f24a8-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]72-编辑距离](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/04/88c60-imageff84a6c5047db6ed.png&w=280&h=210&a=&zc=1)
![[leetcode]125-验证回文串](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/5bfa5-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[程序员面试宝典]17.16-按摩师](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/9ecc9-image.png&w=280&h=210&a=&zc=1)
![【每日打卡】[剑指offer]面试题40-最小的k个数](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/c83c9-imagec745c425c670e18c.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]-409最长回文子串](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/e5589-image788d511d7c1e839c.png&w=280&h=210&a=&zc=1)
![【每日打卡】[leetcode]面试题1.6-字符串压缩](https://www.dyxmq.cn/wp-content/themes/begin/prune.php?src=https://www.dyxmq.cn/wp-content/uploads/2020/03/776bc-image.png&w=280&h=210&a=&zc=1)
评论