二分查找解题

📅 2026/6/23 11:34:41
二分查找解题
我的第一版代码是class Solution { public: int search(vectorint nums, int target) { int left,right; left0; rightnums.size()-1; int mid(rightleft)/2; while(nums[mid]!target){ if(targetnums[mid]left!right){ leftmid1; mid(rightleft)/2; } else if(targetnums[mid]left!right){ rightmid-1; mid(rightleft)/2; } else if(leftright){ return -1; break; } } return mid;} };思路是如果找到了mid等于目标就返回mid如果没找到就进入while循环。如果目标大于中间值说明中间值不会是目标leftmid1但如果左右都挨着了目标大于最右边或者小于最左边就不再继续了所以写了left!right同理如果左边大于等于右边也就是中间值已经不再区间内了就return -1.我觉得特别完美。但是只通过了6个实例。我非常难过。第三个分支else if (left right)只有在前两个条件都为假时才会执行。随即更换成更简单的循环思路当left小于等于right时循环这样如果超出了就直接返回-1class Solution { public: int search(vectorint nums, int target) { int left,right; left0; rightnums.size()-1;//// 定义target在左闭右闭的区间里[left, right]还有一种做法是左闭右开 int mid(rightleft)/2; while(leftright){ if(targetnums[mid]){ leftmid1; mid(rightleft)/2; } else if(targetnums[mid]){ rightmid-1; mid(rightleft)/2; } else return mid; } return -1; } };开篇之作做第二道题准备用左闭右开的方法class Solution { public: int searchInsert(vectorint nums, int target) { int left0; int rightnums.size();//左闭右开 while(leftright){ int mid(left(right-1))/2; if(targetnums[mid]){ leftmid1;//这里第一次做错了左闭记得加一 } else if(targetnums[mid]){ rightmid; } else return mid; } return left; } };为什么左闭就要加1右闭就要减1呢不加不减就会超时解释“左闭”意味着left索引在搜索范围内。当nums[mid] target时mid位置已被检查且不符合要求所以必须从区间中剔除。因为左端是“闭”的包含如果设置left mid就会把不合格的元素重新圈进来导致区间无法缩小死循环。所以必须left mid 1。