目录
1.暴力
找到数字遍历到下一个结束位置然后求出长度
2.二分
数组是排序的嘛毕竟~,想必很多人都知道怎么写,总体思路也是求左右区间然后求长度:
class Solution {
public:
int binarySearch(vector<int>& nums, int target, bool lower) {
int left = 0, right = (int)nums.size() - 1, ans = (int)nums.size();
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
} else {
left = mid + 1;
}
}
return ans;
}
int search(vector<int>& nums, int target) {
int leftIdx = binarySearch(nums, target, true);
int rightIdx = binarySearch(nums, target, false) - 1;
if (leftIdx <= rightIdx) {
//&& rightIdx < nums.size() && nums[leftIdx] == target && nums[rightIdx] == target
return rightIdx - leftIdx + 1;
}
return 0;
}
};
但是每次,二分查找中的边界问题总是让人头大呢。
这里有些细节:
用low实现了求区间点的合并。
这个ans的设置,可以举一个[1]来试试,但是为什么这样设置我也不大懂。。。
说实话offer中拆开的函数感觉理解起来更人性化。具体可以见原书p263
当然,书中的《0~n-1中缺失的数字》和《数组中数值和下标相等的元素》两个例子我觉得对于理解二分也很友好,感兴趣的同学可以康康~