package com
public class Test {
public static void main(String[] args) {
int[] nums = {4,7,7,9,12,13};
int index = searchLastSmaller(nums,1);
System.out.println(index);
}
/*
* 第一个与key相等的元素
*/
public static int searchFirstEqual(int[] arr, int key){
int left = 0, right = arr.length-1;
while(left<=right){
int mid = (left+right)/2;
if(arr[mid]>=key)right=mid-1;
else if(arr[mid]<key) left = mid+1;
}
if(left<arr.length&&arr[left]==key) return left;
return -1;
}
/*
* 找出最后一个与key相等的元素
*/
public static int searchLastEqual(int[] arr, int key){
int left = 0, right = arr.length-1;
while(left<=right) {
int mid = (left+right)/2;
if(arr[mid] > key) right = mid - 1;
else if(arr[mid] <= key) left = mid + 1;
}
if( right>=0 && arr[right] == key) return right;
return -1;
}
/*
* 找出第一个大于等于key的元素
*
*/
public static int searchFirstEqualOrLarger(int arr[],int key){
int left=0, right=arr.length-1;
while(left<=right) {
int mid = (left+right)/2;
if(arr[mid] >= key) right = mid-1;
else if (arr[mid] < key) left = mid+1;
}
if(left>=arr.length)return -1;
return left;
}
/*
* 查找第一个大于key的元素
*/
public static int searchFirstLarger(int[] arr, int key){
int left=0, right=arr.length-1;
while(left<=right) {
int mid = (left+right)/2;
if(arr[mid] > key) right = mid-1;
else if (arr[mid] <= key) left = mid+1;
}
if(left>=arr.length)return -1;
return left;
}
/*
* 查找最后一个小于或等于Key的元素
*/
public static int searchLastEqualOrSmaller(int[] arr, int key){
int left=0, right=arr.length-1;
while(left<=right) {
int m = (left+right)/2;
if(arr[m] > key) right = m-1;
else if (arr[m] <= key) left = m+1;
}
//若right=-1,表明不存在
return right;
}
/*
* 查找最后一个小于key的元素
*/
public static int searchLastSmaller(int[] arr, int key){
int left=0, right=arr.length-1;
while(left<=right) {
int mid = (left+right)/2;
if(arr[mid] >= key) right = mid-1;
else if (arr[mid] < key) left = mid+1;
}
//若right=-1,表明不存在
return right;
}
}
二分法变种
最新推荐文章于 2021-05-26 19:13:57 发布