[LeetCode] 34. Search for a Range
Given an array of integers 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]
.
For example,
Given
return
Given
[5, 7, 7, 8, 8, 10]
and target value 8,return
[3, 4]
.
Thought process:
In order to make the time complexity O(logn), we need to perform two binary searches for the left end and right end.
- When searching for the left end, we want the result to be as left as possible, so we set end = mid when mid == target.
- When searching for the right end, we want the result to be as right as possible, so we set start = mid when mid == target.
Remember to check for empty array before calling nums.length.
Solution:
C++:
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { if (nums.size() == 0) { return vector<int>(2, -1); } vector<int> range; size_t start = 0; size_t end = nums.size() - 1; while (start + 1 < end) { int mid = start + (end - start) / 2; if (nums[mid] >= target) { end = mid; } else { start = mid; } } if (nums[start] == target) { range.push_back(start); } else if (nums[end] == target) { range.push_back(end); } else { return vector<int>(2, -1); } start = 0; end = nums.size() - 1; while (start + 1 < end) { int mid = start + (end - start) / 2; if (nums[mid] <= target) { start = mid; } else { end = mid; } } if (nums[end] == target) { range.push_back(end); } else { range.push_back(start); } return range; } }; |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public class Solution { public int[] searchRange(int[] nums, int target) { int[] range = { -1, -1 }; if (nums.length == 0) { return range; } int start = 0; int end = nums.length - 1; while (start + 1 < end) { int mid = start + (end - start) / 2; if (nums[mid] == target || nums[mid] > target) { end = mid; } else { start = mid; } } if (nums[start] == target) { range[0] = start; } else if (nums[end] == target) { range[0] = end; } else { return range; } start = 0; end = nums.length - 1; while (start + 1 < end) { int mid = start + (end - start) / 2; if (nums[mid] == target || nums[mid] < target) { start = mid; } else { end = mid; } } if (nums[end] == target) { range[1] = end; } else { range[1] = start; } return range; } } |
Time complexity:
Each search takes O(logn) respectively. The overall complexity is O(logn).
Comments
Post a Comment