二分查找一般分为三个部分:(1)对数组排序(2)使用循环或递归将比较后的数组分为两个部分(3)确定留下的是哪一部分
二分查找的本质:删除不符合条件的那一部分
模板一:(二分基本模板)
//模板一适用条件:模板一是二分查找最基础的形式 //它的前提要求是查找条件只与当前的mid比较,不与周围元素比较 // 可以用于通过访问单个索引解决的问题 int binarySearch(int[] nums, int target){ int left=0; int right=nums.length-1; while (left<=right){ int mid=left+(right-left)/2; if(nums[mid]==target) return mid; else if(nums[mid]<target) left=mid+1; else right=mid-1; } return -1; }
模板二:二分特殊情况(0000011111111)01模型
int binarySearch(int[] nums, int target){//01模型 int left=0; int right=nums.length-1; while (left<right){ int mid=left+(right-left)/2; if(指向为1){ right=mid; }else {//指向为0 left=mid+1; } } return left; // return right;//此时,left=right,找到元素所在位置 }
模板三:二分特殊模板(10模型)
int binarySearch(int[] nums, int target){//10模型 int left=0; int right=nums.length-1; while (left<right){ int mid=left+(right-left+1)/2; if(指向为1){ left=mid; }else {//指向为0 right=mid-1; } } return left; // return right; }