二分法的三种写法
一、有序不重复的数组
比如在数组{1,3,6,9,13}中,查找9这个元素出现的索引位置,如果不存在返回-1
public int find1(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == k){
return mid;
}else if(nums[mid] > k){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
二、有重复元素,并查找第一次出现的索引
比如数组{1,3,3,6,9,13}中,查找3第一次出现的位置索引,不存在返回-1
public int find2(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] >= k){
right = mid - 1;
}else{
left = mid + 1;
}
}
if(left <= nums.length - 1 && nums[left] == k){
return left;
}
return -1;
}
三、有重复元素,并查找最后一次出现的索引
比如数组{1,3,3,6,9,13}中,查找3第一次出现的位置索引,不存在返回-1
public int find3(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] <= k){
left = mid + 1;
}else{
right = mid - 1;
}
}
if(right >= 0 && nums[right] == k){
return right;
}
return -1;
}
比较
- find1 vs find2
- find2 vs find3