二分查找应用于已经排好序
没有重复值得查找
private static int[] arr = {1, 2, 3, 4, 5, 6, 7};
public static int get(int key) {
int lo = 0;
int hi = arr.length - 1;
while (lo <= hi) { //此处必须包含等于
int index = lo + ((hi - lo) >> 1); //如果是右移运算符 必须括号括起来 lo + ((hi - lo) >> 1)
if (arr[index] == key) {
return index;
}
if (arr[index] < key) {
lo = index + 1;
}
if (arr[index] > key) {
hi = index - 1;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(get(3));
}
有重复值得查找-查找重复值最后一个元素
/**
* 有可能多张同面值实效日期不一样的劵,需要优先选择实效日期最近的劵
* 找最后一个等于值
* [1,3,3] 取第二个3
*
* @param key
* @return
*/
public static int lastEqualsKey(int [] states, int key) {
int lo = 0;
int length = states.length;
int hi = length - 1;
//此处必须包含等于
while (lo <= hi) {
//如果是右移运算符 必须括号括起来 lo + ((hi - lo) >> 1)
int index = lo + ((hi - lo) >> 1);
int denomination = states[index];
if (denomination == key) {
int idx = index;
while (idx + 1 <= length) {
int amount = states[idx];
if (idx + 1 == length && amount == key) {
return idx;
}
if (amount < states[idx + 1] && amount == key) {
return idx;
}
idx++;
}
return index;
}
if (denomination < key) {
lo = index + 1;
}
if (denomination > key) {
hi = index - 1;
}
}
return -1;
}