原题:
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given targetvalue.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8 Output: [3,4]Example 2:
Input: nums = [5,7,7,8,8,10], target = 6 Output: [-1,-1]给出一个排序好的数列和目标数字,找到所有目标数字的范围,想法是先二分查找,找到了分别向左右扩散查找,结果:
Success
Runtime: 4 ms, faster than 99.50% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.1 MB, less than 100.00% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
代码:
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { int l=0; int r=nums.size()-1; int m=0; while(l<=r){ m=(l+r)/2; if(nums[m]==target){break;} else if(nums[m]>target){r=m-1;} else if(nums[m]<target){l=m+1;} } if(!nums.size()||nums[m]!=target){vector<int> re(2,-1);return re;} l=m;r=m; while(l>=0&&nums[l]==target){l--;} while(r<=nums.size()-1&&nums[r]==target){r++;} vector<int> re(2,0); re[0]=l+1; re[1]=r-1; return re; } };看了solution发现有一个target在数列中存在的数量很多时会更快的算法啊,两趟二分查找,第一趟m>=target时r=m,否则l=m+1,这样就可以找到左界,第二趟m>target时r=m,否则l=m+1,这样可以找到右界,结果:
Success
Runtime: 8 ms, faster than 85.06% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.2 MB, less than 98.90% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
代码:
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> re(2,0); int l=0; int r=nums.size()-1; int m=0; while(l<r){ m=(l+r)/2; if(nums[m]>=target){r=m;} else if(nums[m]<target){l=m+1;} } if(r==-1||nums[l]!=target){re[0]=-1;re[1]=-1;return re;} re[0]=l; l=0;r=nums.size()-1; while(l<r){ m=(l+r)/2; if(nums[m]>target){r=m;} else if(nums[m]<=target){l=m+1;} } if(nums[r]==target){r++;} re[1]=r-1; return re; } };