主页 > 人工智能  > 

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标

🌱博主简介:大一计科生,努力学习Java中!热爱写博客~预备程序媛 📜所属专栏:LeetCode每日一题–进击大厂 ✈往期博文回顾: 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标 🕵️‍♂️近期目标:成为千粉小博主。 🌺“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”

34. 在排序数组中查找元素的第一个和最后一个位置

解题思路 题型:数组、二分查找(变式)—寻找第1个等于目标值的元素&寻找最后1个等于目标值的元素关键:二分查找的关键点就是–逐渐缩小搜索区间(若搜索区间没有被缩小,则会二分失败,导致死循环)思路: 1.确定答案可能取值区间[left,right]—[0,len-1] 2.left = 0;right = array.length-1; 3.while(left<right)(不考虑所谓的什么闭区间,就仅仅代表它本身的含义: 4.🌟分情况讨论!分别找出: 第1个等于target的元素最后1个等于target的元素

🙋‍♀️根据我自己的理解画的图:

代码实现: class Solution { public int[] searchRange(int[] nums, int target) { int len=nums.length; if(len==0){ return new int[]{-1,-1};//数组长度为0 } int firstPosition = findFisrtPosition(nums,target); if(firstPosition==-1){ return new int[]{-1,-1}; } int lastPosition = findLastPosition(nums,target); return new int[]{firstPosition,lastPosition}; } private int findFisrtPosition(int[] nums,int target){ int left=0; int right=nums.length-1; while(left<right){ int mid=left+(right-left)/2;//防止溢出 if(nums[mid]>=target){ right=mid;//下一轮搜索区间为[left,mid] } else{ left=mid+1; } } if(nums[left]!=target){//目标元素不在数组中 return -1; } return right; } private int findLastPosition(int[] nums,int target){ int left=0; int right=nums.length-1; while(left<right){ int mid=left+(right-left+1)/2;//防止溢出 if(nums[mid]<=target){ left=mid;//下一轮搜索区间为[mid,right] } else{ right=mid-1; } } return left; } } 细节: 1.如果数组长度为0,直接返回[-1,-1] 2.如果firstPosition找不到,直接返回[-1,-1] 3.寻找第一个等于targer元素时:退出循环后不能判断此区间的元素是target!需要再次判断! 4.🌟这里findLastPosition中:mid = left+(right-left+1)/2中的+1是不能省的!目的还是当只剩两个元素时,mid指针指向的是后一个元素,按照[left,mid-1]、[mid,right]来分才有可能缩小区间。(避免死循环的关键) 🙇‍♀️建立此专栏的初衷是为了监督自己每天认真刷一个题,积少成多。并把自己每次刷题的思路、收获以博文的形式分享出来,帮助更多人,以及方便后续复习。如果有兴趣的同学可以订阅此专栏,我们一起刷题,一起交流,进步和学习!专栏:LeetCode每日一题–进击大厂

标签:

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标