标签:二分 right num target int mid 查找 left
一、思路
使用二分查找的前提是数组是有序的,思路是把整个数组根据中点一分为二,如果target小于中点,则将搜索目标缩小为左半部分再继续搜索,否则搜索目标缩小为右半部分,直到找到中点为target返回。
二、解题模板
int binarySearch(int[] nums, int target) { int left = 0, 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 if (nums[mid] > target) { right = mid-1; } } return -1; }
注意:(1)left值和right值都是nums的可访问下标,因此搜索区间为左闭右闭。所以,当left==right时,搜索区间还有一个数,依旧可以进入循环。另外,当搜 索区间缩小时,也应该防止再将mid纳入搜索区间(即left=mid+1或right=mid-1)。
(2)计算 mid
时需要防止溢出,代码中 left + (right - left) / 2
就和 (left + right) / 2
的结果相同,但是有效防止了 left
和 right
太大,直接相加导致溢出的情况。
三、特殊情况
找左边界:当找到num[mid]==target时不要急着返回,而是缩小右边界;最后返回left(取值为[0,num.length])所以要判断是否越界(left<num.length)
找右边界:当找到num[mid]==target时不要急着返回,而是缩小左边界;最后返回right(left-1 == right),right取值为[-1,num.length-1],所以要判断是否越界(right<0)
参考:labuladong算法小抄
标签:二分,right,num,target,int,mid,查找,left 来源: https://www.cnblogs.com/cxuep/p/16654010.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。