二分查找算法虽然简单,但是遇到待查找的term有重复的时候,也会存在各种小问题。下面给出二分查找中遇到重复term时,第一个可插入位置和最后一个可插入位置的代码。
第一个可插入位置:
class Solution {
public:
int binarySearch(vector<int> &array, int target) {
if(array.size() == 0) {
return -1;
}
int start = 0;
int end = array.size() - 1;
int mid;
while(start + 1 < end) {
mid = start + (end - start) / 2;
if(array[mid] == target) {
end = mid; // 片段1
} else if(array[mid] > target) {
end = mid;
} else if(array[mid] < target) {
start = mid;
}
}
// 片段2
if(array[start] == target) {
return start;
}
// 片段3
if(array[end] == target) {
return end;
}
return -1;
}
};
最后一个可插入位置:
1、将片段1中的代码换为:start = mid;
2、将片段2和片段3的代码位置互换。