二分查找BinarySearch

阅读: 评论:0

二分查找BinarySearch

二分查找BinarySearch

概述

二分查找,高效易用,但边界问题常常让人犯愁。

公式

    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;}
  • 找第一个:左边不满足,return right
  • 找最后一个:右边不满足,return left

原理

找蓝红边界
数组找边界
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的值");}

reference

本文发布于:2024-02-08 19:54:40,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170739344068548.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:BinarySearch
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23