34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
该题使用双指针可以比较轻松地解决,但是要保证时间复杂度为*o(logN)*那就要用二分查找了。两边二分查找的代码如下(C++版):
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> result; result.push_back(left_bound(nums, target)); result.push_back(right_bound(nums, target)); return result; } private: int right_bound(vector<int>& nums, int target) { int begin=0; int end=nums.size()-1; while(begin<=end) { int mid=(begin+end)/2; if(nums[mid]==target) { if(mid==nums.size()-1||nums[mid+1]>target) return mid; begin=mid+1; } else if(nums[mid]>target) end=mid-1; else if (nums[mid]<target) begin=mid+1; } return -1; } int left_bound(vector<int>& nums, int target) { int begin=0; int end=nums.size()-1; while(begin<=end) { int mid=(begin+end)/2; if(nums[mid]==target) { if(mid==0||nums[mid-1]<target) return mid; end=mid-1; } else if(nums[mid]>target) end=mid-1; else if (nums[mid]<target) begin=mid+1; } return -1; } };
运行效果:
二分查找不但可以找定值还可以找上限,具体代码如下(Python版):
class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: def boundSeach(nums,target,lower): start,end=0,len(nums)-1 res=len(nums) while(start<=end): mid=int((end+start)/2) if nums[mid] > target or (lower and nums[mid]==target): end=mid-1 res=mid else: start=mid+1 return res result=list() left=(boundSeach(nums,target,True)) right=(boundSeach(nums,target,False))-1 if left<=right and right<len(nums) and nums[left] is target and nums[right] is target: result=[left,right] return result return [-1,-1]
运行效果:
用Scala写了一个双指针的代码:
object Solution { def searchRange(nums: Array[Int], target: Int): Array[Int] = { var left:Int=0 var right:Int=nums.size-1 var result:Array[Int]=Array(-1,-1) while(left<nums.size && nums(left) != target) left+=1 if(left == nums.size) { return result } while(right>=0 && nums(right) != target) right-=1 result(0)=left result(1)=right return result } }
运行效果:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
c/c++开发分享在排序数组中查找元素的第一个和最后一个位置地址:https://blog.csdn.net/qq_41978896/article/details/110419869
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/596528.html