二分查找算法思路(二分查找-力扣(Java))
导读:题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。...
题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target ,如果目标值存在返回下标,否则返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有 。商业转载请联系官方授权 ,非商业转载请注明出处 。简要描述二分法
首先应为一个有序数列 ,我们将会数字设定为一个数组nums ,将要在数组中寻找的目标设置为target 。在数组中 ,对数组中间值nums[middle]与target进行判断 ,并对其进行空间的压缩 ,然后再次判断新的nums[middle]与target的大小关系 ,直到nums[middle]与target相等为止
思路
首先明确题目要求 ,为寻找目标值 ,若存在返回下标,不存在则返回-1 ,标准的二分查找 明确了二分查找要求后 ,确定使用左闭右闭还是左闭合又开,即选择[left,right]还是[left,right) ,这里我选择的是左闭右闭 确定了使用左闭右闭写法之后 ,便应该明确怎么写代码 。由于目标值在[left,right]区间,所以while(left ? right)中?处应填写<= ,因为在[left,right]区间中,left == right是存在的 ,例[1,1] ,所以应当使用<= 同时判断语句if (nums[middle] > target) 时,由于middle大于目标值 ,所以即目标值出现在左半边 ,所以应当将right(即右边界)赋值为middle - 1 ,因为判断条件为if (nums[middle] > target) ,此时的nums[middle] 必然不是目标值 ,所以可以自然往左一位 而判断语句if (nums[middle] < target)时 ,由于middle小于目标值 ,所以即目标值出现在右半边,所以应当将left(即左边界)赋值为middle + 1 ,原因参考上一点 当nums[middle] = tarage 时 ,直接return middle输出结果即可 最后在while循环外写入return -1表示目标值不存在即可代码
class Solution { public int search(int[] nums, int target) { int left = 0 ; int right = nums.length -1; while(left <= right){ int middle = left + (right - left) / 2; if(nums[middle] > target) right = middle -1; else if(nums[middle] < target) left = middle + 1; else if(nums[middle] == target) return middle; } return -1; } }提交截图
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!