二分查找,高效易用,但边界问题常常让人犯愁。
public int searchInsert(int[] nums, int target) {// 保证颜色纯粹性int left = -1;int right = nums.length;while (left + 1 != right) {int mid = (left + right) / 2;if (isBlue(mid)) {left = mid;} else {right = mid;}}return left or right;}
找蓝红边界
数组找边界
0-4为Blue
5-8为Red
【01234 5678】
l和r两个指针,分别指示蓝色和红色的区域,
每次折半拆分,确定一半未知区域的颜色。
private static int firstGreaterFive(int[] arr) {int left = -1;int right = arr.length;while (left + 1 != right) {int mid = (left + right) / 2;if (arr[mid] <= 5) {left = mid;} else {right = mid;}}return right;}private static int firstGreaterEqualFive(int[] arr) {int left = -1;int right = arr.length;while (left + 1 != right) {int mid = (left + right) / 2;if (arr[mid] < 5) {left = mid;} else {right = mid;}}return right;}private static int lastLessFive(int[] arr) {int left = -1;int right = arr.length;while (left + 1 != right) {int mid = (left + right) / 2;if (arr[mid] < 5) {left = mid;} else {right = mid;}}return left;}private static int lastLessEqualFive(int[] arr) {int left = -1;int right = arr.length;while (left + 1 != right) {int mid = (left + right) / 2;if (arr[mid] <= 5) {left = mid;} else {right = mid;}}return left;}public static void main(String[] args) {int[] arr = {0, 1, 2, 3, 4, 5, 5, 5, 8, 9};Assert.isTrue(firstGreaterFive(arr) == 8, "查找第一个大于5的值");Assert.isTrue(firstGreaterEqualFive(arr) == 5, "查找第一个大于等于5的值");Assert.isTrue(lastLessFive(arr) == 4, "查找最后一个小于5的值");Assert.isTrue(lastLessEqualFive(arr) == 7, "查找最后一个小于等于5的值");}
本文发布于:2024-02-08 19:54:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170739344068548.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |