標籤:
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].
[LeetCode Source]
思路:
1)先用二分尋找找到點,然後再左右擴充,找到範圍。如果有m個要搜尋點,演算法複雜度為O(lgN+m),m<=N。最好的情況下是O(lgN),只有一個點的時候;最差情況O(N),全是要搜尋點的時候。這種做法可以Ac。
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> result(2,-1); int left = 0; int right = nums.size()-1; int mid = 0; int first = -1; int second = -1; while(left<=right){ mid = left+(right-left)/2; if(nums[mid] > target) right = mid - 1; if(nums[mid] < target) left = mid + 1; if(nums[mid] == target){ first = mid; second = mid; break; } } for(int i=mid-1;i>=0;i--){ if(nums[i]==target) first--; else break; } for(int i=mid+1;i<nums.size();++i){ if(nums[i]==target) second++; else break; } result[0] = first; result[1] = second; return result; }};
2)可能是最優解法。兩次二分尋找,一次是找到左邊界點,第二次找到右邊界點。
找左邊界點時,修改二分尋找的規則,如果找到點,還要繼續往左二分直到找到左邊界點;
找右邊界點時,同理。
特別注意break的處理,當明顯找不到點時break掉迴圈,對於找左邊界點就是nums[right]<target。
這種解法複雜度是O(lgN)
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int hit = -1; int left=0, right=nums.size() - 1; int first = 0, second = 0; vector<int> ret(2, -1); while(left <= right) { int mid = left + (right - left) / 2; if(nums[right] < target) break; if(nums[mid] >= target) { if(nums[mid] == target) hit = mid; right = mid - 1; } else { left = mid + 1; } } if(hit == -1) return ret; first = hit; left = hit; right = nums.size() - 1; hit = -1; while(left <= right) { int mid = left + (right - left) / 2; if(nums[left] > target) break; if(nums[mid] <= target) { if(nums[mid] == target) hit = mid; left = mid + 1; } else { right = mid - 1; } } if(hit == -1) return ret; second = hit; ret[0] = first; ret[1] = second; return ret;}};
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[LeetCode]Search for a Range