二分法问题
Posted yangbocsu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分法问题相关的知识,希望对你有一定的参考价值。
二分法问题
一、有序数组中找到num
public static boolean find(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) / 2;
if (arr[mid] == num)
return true;
else if (arr[mid] < num)
L = mid + 1;
else
R = mid - 1;
return false;
二、有序数组中找到> =num最左的位置
// arr有序的,>=num 最左
public static int mostLeftNoLessNumIndex(int[] arr, int num)
if (arr == null || arr.length == 0)
return -1;
int L = 0;
int R = arr.length - 1;
int ans = -1;
while (L <= R)
int mid = (L + R) / 2;
if (arr[mid] >= num) //砍掉右边
ans = mid;
R = mid - 1;
else // 砍掉左边
L = mid + 1;
return ans;
三、有序数组中找到<=num最右的位置
// 在arr上,找满足<=value的最右位置
public static int nearestIndex(int[] arr, int value)
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;
L = mid + 1;
else
R = mid - 1;
return index;
四、局部最小值问题
// arr 相邻的数不相等!
public static int oneMinIndex(int[] arr)
if (arr == null || arr.length == 0)
return -1;
int N = arr.length;
if (N == 1)
return 0;
if (arr[0] < arr[1])
return 0;
if (arr[N - 1] < arr[N - 2])
return N - 1;
int L = 0;
int R = N - 1;
// L...R 肯定有局部最小
while (L < R - 1)
int mid = (L + R) / 2;
if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1])
return mid;
else
if (arr[mid] > arr[mid - 1])
R = mid - 1;
else
L = mid + 1;
return arr[L] < arr[R] ? L : R;
以上是关于二分法问题的主要内容,如果未能解决你的问题,请参考以下文章