二分查找:
找 target 的过程都是一个不断趋近 target 右边界的过程
找 8 左/右边界:
找 target = 8,不断趋近 8 右边界
找 target = 7,不断趋近 7 右边界,即 8 的左界
if (nums[m] <= target){ // nums[m] <或= target, target右边界都在右半段
i = m+1; // 则最终 nums[i] = target,nums[i-1] = target,i在右界
}
c++
class Solution {
public:
int helper(vector<int>& nums, int target){
int i=0;
int j = nums.size()-1;
while (i <= j){
int m = (i+j)/2; // 中值下标
if (nums[m] <= target){ // nums[m] <或= target, target右边界都在右半段
i = m+1; // 则最终 nums[i] = target,nums[i-1] = target,i在右界
}else{
j = m-1;
}
}
return i; // 左界是target下标
}
int search(vector<int>& nums, int target) {
return helper(nums,target) - helper(nums, target - 1);
}
};
python
class Solution:
def search(self, nums: List[int], target: int) -> int:
def helper(target):
i = 0
j = len(nums)-1
while i<=j:
m = (i+j)//2 # python 整除//
if nums[m] <= target:
i = m+1
else:
j = m-1
return i
return helper(target) - helper(target - 1)