尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LeetCode:704. 二分查找

LeetCode:704. 二分查找 简介题目链接https://leetcode.cn/problems/binary-search/description/解决方式数组 二分查找这是作者学习众多大神的思路进行解题的步骤很推荐大家解题的时候去看看题解里面大佬们的思路、想法二分查找系列题34. 在排序数组中查找元素的第一个和最后一个位置进阶二分查找思路题目所给数组是升序的所以我们可以初始化两个左右指针分别指向第一个和最后一个元素。每次迭代的时候先计算中间点根据中间点判断向何处收缩区间。具体可参考labuladong大佬关于二分查找一系列的详细题解classSolution{publicintsearch(int[]nums,inttarget){// 左右边界intleft0;intrightnums.length-1;// 二分查找while(leftright){// 中点// 由数学公式 (left right) / 2 等价而来防止整数溢出intmidleft(right-left)/2;if(nums[mid]target){// 目标在左侧向左收缩rightmid-1;}elseif(nums[mid]target){// 目标在右侧向右收缩leftmid1;}else{// 中点元素就是目标元素直接返回// 由于此题找到即可而不是寻找左右边界所以直接返回returnmid;}}// 没有找到返回 -1return-1;}}拓展寻找左边界思路为了寻找左边界中间点等于目标元素时不能直接返回而是进一步向左收缩减小范围直到找到左边界。intleft_bound(int[]nums,inttarget){intleft0,rightnums.length-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]target){leftmid1;}elseif(nums[mid]target){rightmid-1;}elseif(nums[mid]target){// 别返回进一步减小范围rightmid-1;}}// 检查 left 越界的情况// 一种是目标元素比数组所有元素都大left nums.length// 一种是目标元素在数组范围中但是没有目标元素if(leftnums.length||nums[left]!target)return-1;returnleft;}寻找右边界思路与寻找右边界同理。intright_bound(int[]nums,inttarget){intleft0,rightnums.length-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]target){leftmid1;}elseif(nums[mid]target){rightmid-1;}elseif(nums[mid]target){// 别返回进一步减少范围leftmid1;}}// 检查 right 越界的情况// 一种是目标元素比数组所有元素都小right 0// 一种是目标元素在数组范围中但是没有目标元素if(right0||nums[right]!target)return-1;returnright;}
返回列表