422 字
2 分钟
【算法笔记】(二)二分搜索
1、判断某元素是否在数组中
//arr数组必须有序public static boolean exist (int[] arr ,int target) { if (arr == null || arr.length == 0) { return false; } int l = 0 ,r = arr.length - 1; while (l <= r) { int mid = l + ((r - l) >> 1); if (arr[mid] < target) { l = mid + 1; } else if (arr[mid] > target) { r = mid - 1; } else { return true; } } return false;}2、寻找数组中>=target的最左位置
//arr数组必须有序public static int findTargetLeft (int[] arr ,int target) { int ans = -1; if (arr == null || arr.length == 0) { return ans; } int l = 0 ,r = arr.length - 1; while (l <= r) { int mid = l + ((r - l) >> 1); if (arr[mid] >= target) { ans = mid; r = mid - 1; } else { l = mid + 1; } } return ans;}3、寻找数组中<=target的最右位置
//arr数组必须有序public static int findTargetRight (int[] arr ,int target) { int ans = -1; if (arr == null || arr.length == 0) { return ans; } int l = 0 ,r = arr.length - 1; while (l <= r) { int mid = l + ((r - l) >> 1); if (arr[mid] <= target) { ans = mid; l = mid + 1; } else { r = mid - 1; } } return ans;}4、峰值问题
//数组相邻元素不相等、峰值定义为严格大于两侧邻居public static int findPeak (int[] arr) { int n = arr.length; if (n == 0) { return -1; } if (arr.length == 1) { return 0; } if (arr[0] > arr[1]) { return 0; } if (arr[n - 1] > arr[n - 2]) { return n - 1; }
int l = 1 ,r = n - 2 ,ans = -1; while (l <= r) { int mid = l + ((r - l) >> 1); if (arr[mid - 1] > arr[mid]) { r = mid - 1; } else if (arr[mid] < arr[mid + 1]) { l = mid + 1; } else { ans = mid; break; } } return ans;}部分信息可能已经过时









