一、在升序数组中找到num
题目
在一个有序数组中,找某个数是否存在,存在返回true,不存在返回false
代码
package binary;
public class BSExist {
public boolean bSExist(int[] arr, int num) {
if (arr == null || arr.length == 0) {
return false;
}
int L = 0;
int R = arr.length - 1;
while (L < R) {
int mid = (L + R) >> 1;
if (arr[mid] > num) {
R = mid - 1;
} else if (arr[mid] < num) {
L = mid + 1;
} else {
return true;
}
}
return arr[L] == num;
}
}
二、找到最靠近num的最左侧的位置
题目
在一个升序数组中,找到>=num的最左侧的位置
代码
package binary;
public class BSNearLeft {
public int bSNearLeft(int[] arr, int value) {
if (arr == null) {
return -1;
}
int L = 0;
int R = arr.length - 1;
int index = -1;
while (L <= R) {
int mid = L + ((R - L) >> 1);
if (arr[mid] >= value) {
index = mid;
R = mid - 1;
} else {
L = mid + 1;
}
}
return index;
}
}
三、找到最靠近num的最右侧的位置
题目
在一个升序数组中,找到<=num的最右侧的位置
代码
package binary;
public class BSNearRight {
public int bSNearLeft(int[] arr, int num) {
if (arr == null) {
return -1;
}
int L = 0;
int R = arr.length - 1;
int index = -1;
while (L <= R) {
int mid = (L + R) >> 1;
if (arr[mid] <= num) {
L = mid + 1;
index = mid;
} else {
R = mid - 1;
}
}
return index;
}
}
四、找到数组中的局部最小值
题目
在一个相邻的位置的值都不相等的数组中,找到局部最小值(定义如果数组长度为1,那么局部最小值为0)
代码
package binary;
public class BSAwesome {
public int bSAwesome(int[] arr) {
if (arr == null || arr.length == 0) {
return -1;
}
if (arr.length == 1||arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length - 2] > arr[arr.length - 1]) {
return arr.length - 1;
}
int L = 0;
int R = arr.length - 1;
while (L <= R) {
int mid = (L + R) >> 1;
if (arr[mid] < arr[mid + 1]) {
if (arr[mid] < arr[mid - 1]) {
return mid;
}
R = mid - 1;
} else {
L = mid + 1;
}
}
return -1;
}
}