一、今日学习的文章链接和视频链接题目链接https://leetcode.cn/problems/binary-search视频讲解https://www.bilibili.com/video/BV1fA4y1o715二、自己看到题目的第一想法看到题目第一眼就意识到这是最基础的二分查找题型核心利用数组升序且无重复元素的特性通过不断缩小查找区间来定位目标值。第一反应是直接定义左右两个指针left和right用while循环遍历区间每次计算中间下标mid通过比较nums[mid]和target的大小调整区间边界找到目标直接返回下标循环结束未找到则返回-1。但也隐约记得二分查找的边界条件是易错点比如循环条件该写left right还是left rightright初始值该是nums.size()还是nums.size()-1这些细节一开始没完全理清。三、自己实现过程中遇到哪些困难1. 边界条件混淆一开始把right初始值写成了nums.size()左闭右开区间思路但循环条件写了left right导致第一次测试就出现数组越界错误。纠结循环条件的选择写left right时忘记处理最后一个元素的判断导致目标值刚好是数组最后一个元素时返回-1。2. mid 计算溢出问题初期直接用int mid (left right) / 2计算中间下标虽然小数据量测试没问题但知道这种写法在数组长度极大时会出现整数溢出不符合算法严谨性。3. 区间调整逻辑错误第一次写代码时把left mid和right mid写成了固定值没考虑到目标值不在 mid 本身的情况导致循环陷入死循环或直接跳过目标值。四、今日收获心得彻底搞懂了二分查找的两种区间写法左闭右闭[left, right]本题适用right nums.size()-1循环条件left right区间调整left mid1/right mid-1和左闭右开[left, right)right nums.size()循环条件left right区间调整left mid1/right mid。class Solution { public: int search(vectorint nums, int target) { int left 0; int right nums.size() - 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; } };