1.基本的二分搜索(查找一个数)
(1)写法1:包含右边界
int binary_search ( int [ ] nums, int target) {
int left = 0 , right = nums. length - 1 ;
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid - 1 ;
} else if ( nums[ mid] == target) {
return mid;
}
}
return - 1 ;
}
(2)写法2:不包含右边界
int binary_search ( int [ ] nums, int target) {
int left = 0 , right = nums. length;
while ( left < right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid;
} else if ( nums[ mid] == target) {
return mid;
}
}
return - 1 ;
}
2.查找左边界
(1)写法1(包含右边界)
int left_bound ( int [ ] nums, int target) {
int left = 0 , right = nums. length - 1 ;
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid - 1 ;
} else if ( nums[ mid] == target) {
right = mid - 1 ;
}
}
if ( left >= nums. length || nums[ left] != target)
return - 1 ;
return left;
}
(2)写法2(不包含右边界)
int left_bound ( int [ ] nums, int target) {
int left = 0 , right = nums. length;
while ( left < right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid;
} else if ( nums[ mid] == target) {
right = mid;
}
}
return left;
}
3.寻找右边界
(1)写法1(包含右边界)
int right_bound ( int [ ] nums, int target) {
int left = 0 , right = nums. length - 1 ;
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid - 1 ;
} else if ( nums[ mid] == target) {
left = mid + 1 ;
}
}
if ( right < 0 || nums[ right] != target)
return - 1 ;
return right;
}
(2)写法2(不包含右边界)
int right_bound ( int [ ] nums, int target) {
int left = 0 , right = nums. length;
while ( left < right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid;
} else if ( nums[ mid] == target) {
left = mid + 1 ;
}
}
return right- 1 ;
}