Leetcode-704

题目704.二分查找

难度:简单

给定一个 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

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

两种方法,注意边界条件和更新条件

解题代码

class Solution {
public:
    // 定义target在左闭右开的区间里,即:[left, right]
    int search(vector<int> &nums, int target) {
        int head = 0;
        int rear = nums.size() - 1;
        int mid;
        while (head <= rear) {
            mid = (head + rear) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target) {
                head = mid + 1; // 注意
            } else if (nums[mid] > target) {
                rear = mid - 1;
            }
        }
        return 0;
    }

    // 定义target在左闭右开的区间里,即:[left, right)
    int search2(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
        while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
            int middle = left + ((right - left) >> 1);
            if (nums[middle] > target) {
                right = middle; // target 在左区间,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,在[middle + 1, right)中
            } else { // nums[middle] == target
                return middle; // 数组中找到目标值,直接返回下标
            }
        }
        // 未找到目标值
        return -1;
    }

};
posted @   tianwen42  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示