二分查找
在有序数组中查找一个具体的目标值,主要分为三种情况:
- 目标位置任意匹配;
- 目标位置最右匹配;
- 目标位置最左匹配。
目标位置任意匹配
int findPosition(vector<int> &nums, int target){
if (nums.size() <= 0){
return -1;
}
int len = nums.size();
int low = 0, high = len - 1, mid;
while (low <= high){
mid = low + (high - low) / 2;
if (nums[mid] == target){
return mid;
}
if (nums[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
目标位置最右匹配
int lastPosition(vector<int> &nums, int target) {
if (nums.empty()){
return -1;
}
int len = nums.size();
int left = 0;
int right = len - 1;
while (left < right - 1) {
int mid = left + (right - left) / 2;
if (nums[mid] <= target) {
left = mid;
}
else {
right = mid;
}
}
if (nums[right] == target) {
return right;
}
if (nums[left] == target) {
return left;
}
return -1;
}
目标位置最左匹配
int firstPosition(vector<int> &nums, int target) {
if (nums.empty()) {
return -1;
}
int len = nums.size();
int left = 0;
int right = len - 1;
while (left < right - 1) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
right = mid;
}
else if(nums[mid]>target){
right = mid;
}
else if (nums[mid] < target) {
left = mid;
}
}
if (nums[left] == target) {
return left;
}
if (nums[right] == target) {
return right;
}
return -1;
}