普通版
package com. company;
import static java. lang. System. out;
import java. util. *;
public class Main {
public static int binarySearch ( int [ ] nums, int target) {
int left = 0 ;
int right = nums. length - 1 ;
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target)
return mid;
else if ( nums[ mid] < target)
left = mid + 1 ;
else if ( nums[ mid] > target)
right = mid - 1 ;
}
return - 1 ;
}
public static int left_bound ( int [ ] nums, int target) {
if ( nums. length == 0 ) return - 1 ;
int left = 0 ;
int right = nums. length;
while ( left < right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target) {
right = mid;
} else if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid;
}
}
if ( left == nums. length) return - 1 ;
return nums[ left] == target ? left : - 1 ;
}
public static int right_bound ( int [ ] nums, int target) {
if ( nums. length == 0 ) return - 1 ;
int left = 0 ;
int right = nums. length;
while ( left < right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target)
left = mid + 1 ;
else if ( nums[ mid] < target)
left = mid + 1 ;
else if ( nums[ mid] > target)
right = mid;
}
if ( left == 0 ) return - 1 ;
return nums[ left - 1 ] == target ? ( left - 1 ) : - 1 ;
}
public static void main ( String[ ] args) {
}
}
统一版(易于记忆)
package com. company;
import static java. lang. System. out;
import java. util. *;
public class Main {
public static int binarySearch ( int [ ] nums, int target) {
int left = 0 ;
int right = nums. length - 1 ;
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target)
return mid;
else if ( nums[ mid] < target)
left = mid + 1 ;
else if ( nums[ mid] > target)
right = mid - 1 ;
}
return - 1 ;
}
public static 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) {
right = mid - 1 ;
} else if ( nums[ mid] < target) {
left = mid + 1 ;
} else if ( nums[ mid] > target) {
right = mid - 1 ;
}
}
if ( left > nums. length - 1 || nums[ left] != target)
return - 1 ;
return left;
}
public static 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)
left = mid + 1 ;
else if ( nums[ mid] > target)
right = mid - 1 ;
}
if ( right < 0 || nums[ right] != target)
return - 1 ;
return right;
}
public static void main ( String[ ] args) {
int [ ] nums = { 1 , 3 , 3 , 3 , 4 } ;
int target = 3 ;
out. println ( binarySearch ( nums, target) ) ;
out. println ( left_bound ( nums, target) ) ;
out. println ( right_bound ( nums, target) ) ;
}
}
如果你认为对你有用,关注我的微信公众号支持我一下吧!~