【leetcode】Search for a Range(middle)
Given a sorted array of integers, 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 [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
思路:
我自己用了个最简单的,普通的二分查找,然后两边延伸找起始和结束点。
int *searchRange(int A[], int n, int target) { int ans[2] = {-1, -1}; int l = 0, r = n - 1; while(l <= r) { int m = (l + r) / 2; if(A[m] == target) { ans[0] = ans[1] = m; while(ans[0] - 1 >= 0 && A[ans[0]] == A[ans[0] - 1]) ans[0]--; while(ans[1] + 1 < n && A[ans[1]] == A[ans[1] + 1]) ans[1]++; return ans; } else if(A[m] > target) r = m - 1; else l = m + 1; } return ans; }
大神分成了分别用两次二分查找找起始和结束位置
https://leetcode.com/discuss/18242/clean-iterative-solution-binary-searches-with-explanation中有详细解释
vector<int> searchRange(int A[], int n, int target) { int i = 0, j = n - 1; vector<int> ret(2, -1); // Search for the left one while (i < j) { int mid = (i + j) /2; if (A[mid] < target) i = mid + 1; else j = mid; } if (A[i]!=target) return ret; else ret[0] = i; // Search for the right one j = n-1; // We don't have to set i to 0 the second time. while (i < j) { int mid = (i + j) /2 + 1; // Make mid biased to the right if (A[mid] > target) j = mid - 1; else i = mid; // So that this won't make the search range stuck. } ret[1] = j; return ret; }
另一种通过加减0.5来找位置的方法
class Solution: # @param A, a list of integers # @param target, an integer to be searched # @return a list of length 2, [index1, index2] def searchRange(self, arr, target): start = self.binary_search(arr, target-0.5) if arr[start] != target: return [-1, -1] arr.append(0) end = self.binary_search(arr, target+0.5)-1 return [start, end] def binary_search(self, arr, target): start, end = 0, len(arr)-1 while start < end: mid = (start+end)//2 if target < arr[mid]: end = mid else: start = mid+1 return start