当前位置: 首页 > 后端技术 > Java

LeetCode-034-Findthefirstandlastpositionofanelementinasortedarray

时间:2023-04-01 13:54:15 Java

Findthefirstandlastpositionofanelementinasortedarray题目描述:给定一个升序排列的整数数组nums,以及一个目标值目标。找出给定目标值在数组中的开始和结束位置。如果数组中不存在目标值target,则返回[-1,-1]。进阶:你能设计并实现一个时间复杂度为O(logn)的算法来解决这个问题吗?例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:二分查找,递归用left和right记录起始位置和结束位置,用二分查找的方法在nums中找到target的位置,从0到nums.length-1分别记录为low和high,mid代表中间值,具体过程如下:计算mid为low和high之间的中间值;如果mid的值等于target,则判断mid左边的元素是否等于target,如果相等则递归寻找起始位置,从low到mid-1,如果不相等则左边是中等;判断mid右边的元素是否等于target,如果相等则递归查找结束位置,从mid+1向high查找,如果不相等则right为mid;如果mid的值大于target,high更新为mid-1;如果mid的值小于target,则low更新为mid+1。搜索完成后返回left和right作为最终结果。importjavafx.util.Pair;publicclassLeetCode_034{publicstaticint[]searchRange(int[]nums,inttarget){Pairresult=find(nums,0,nums.length-1,target);返回新的int[]{result.getKey(),result.getValue()};}publicstaticPairfind(int[]nums,intlow,inthigh,inttarget){intmid,left=-1,right=-1;while(low<=high){mid=(low+high)/2;if(nums[mid]==target){if(mid+1<=high&&nums[mid+1]==nums[mid]){right=find(nums,mid+1,high,target).getValue();}else{右=中间;}if(mid-1>=low&&nums[mid-1]==nums[mid]){left=find(nums,low,mid-1,target).getKey();}else{左=中;}休息;}elseif(nums[mid]>target){high=mid-1;}else{低=中+1;}}返回新对<>(左,右);}publicstaticvoidmain(String[]args){int[]nums=newint[]{5,7,7,8,8,10};int[]ints=searchRange(nums,8);System.out.println("["+ints[0]+","+ints[1]+"]");}}【每日留言】春天三月,万物复苏,好事如期而至