intbinarySearch(int[] nums,int target){int left =0, right =...;while(...){int mid = left +(right - left)/2;if(nums[mid]== target){...}elseif(nums[mid]< target){
left =...}elseif(nums[mid]> target){
right =...}}return...;}
技巧:不要出现else, 而是把所有情况用elseif写清楚!!!
实际问题
寻找一个数
intbinarySearch(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;elseif(nums[mid]< target)
left = mid +1;elseif(nums[mid]> target)
right = mid -1;}return-1;}
寻找左侧边界
intleft_bound(int[] nums,int target){if(nums.length ==0)return-1;int left =0;int right = nums.length;while(left < right){int mid = left +(right - left)/2;if(nums[mid]== target)
right = mid;//左闭右开,right不在搜索范围, [left, mid)elseif(nums[mid]< target)
left = mid +1;elseif(nums[mid]> target)
right = mid;//右端边界不能取right,左闭右开}if(left == nums.length)return-1;// 比所有数都大return left;}
寻找右侧边界
intright_bound(int[] nums,int target){if(nums.length ==0)return-1;int left =0;int right = nums.length;while(left < right){int mid = left +(right - left)/2;if(nums[mid]== target)
left = mid +1;//[mid+1, right) elseif(nums[mid]< target)
left = mid +1;elseif(nums[mid]> target)
right = mid;}return left -1;}
统一写法
intbinarySearch(int[] nums,int target){int left =0, right = nums.length -1;while(left <= right){int mid = left +(right - left)/2;if(nums[mid]== target)return mid;elseif(nums[mid]< target)
left = mid +1;elseif(nums[mid]> target)
right = mid -1;}return-1;}intleft_bound(int[] nums,int target){int left =0, right = nums.length -1;while(left <= right){int mid = left +(right - left)/2;if(nums[mid]== target)
right = mid -1;elseif(nums[mid]< target)
left = mid +1;elseif(nums[mid]> target)
right = mid -1;}//检查越界, 是否所有值均小于targetif(left >= nums.length || nums[left]!= target)return-1;return left;}intright_bound(int[] nums,int target){int left =0, right = nums.length -1;while(left <= right){int mid = left +(right - left)/2;if(nums[mid]== target)
left = mid +1;elseif(nums[mid]< target)
left = mid +1;elseif(nums[mid]> target)
right = mid -1;}//检查越界, 是否所有值均大于targetif(right <0|| nums[right]!= target)return-1;return right;}
二分查找笔记二分查找框架实际问题二分查找框架int binarySearch(int[] nums, int target) { int left = 0, right = ...; while(...) { int mid = left + (right - left)/2; if(nums[mid] == target) { ...