Given an array of integers nums
sorted in ascending order, find the starting and ending position of a given target
value.
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]
我的解:
Runtime: 12 ms, faster than 32.21% 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: // 递归进行,二分查找 void binSearch(vector<int>& nums, int target, int begin, int end, int& index1, int& index2) { while (begin <= end) { int mid = begin + (end - begin) / 2; if (nums[mid] == target) { if (mid < index1)index1 = mid; if (mid > index2)index2 = mid; if (begin == end) return ; if (mid > 0 && nums[mid - 1] == target) binSearch(nums, target, begin, mid - 1, index1, index2); if (mid < end && nums[mid + 1] == target) binSearch(nums, target, mid + 1, end, index1, index2); return; } if (nums[mid] < target) { begin = mid + 1; } if (nums[mid] > target) { end = mid - 1; } } } vector<int> searchRange(vector<int>& nums, int target) { vector<int> res{ -1,-1 }; if (nums.size() < 1)return res; int b = 0; int e = nums.size() - 1; int index1 = e + 1; int index2 = b - 1; binSearch(nums, target, b, e, index1, index2); if (index1 <= index2) { res[0] = index1; res[1] = index2; } return res; } };
优秀解1:
Runtime: 8 ms, faster than 85.03% 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 idx1 = lower_bound(nums, target); int idx2 = lower_bound(nums, target+1)-1; if (idx1 < nums.size() && nums[idx1] == target) return {idx1, idx2}; else return {-1, -1}; } // 利用二分查找的思想 int lower_bound(vector<int>& nums, int target) { int l = 0, r = nums.size()-1; while (l <= r) { int mid = (r-l)/2+l; if (nums[mid] < target) l = mid+1; else r = mid-1; } return l; } };