什么是二分查找

image.png

二分查找的基本原则

image.png

三大模板

image.png

查找元素的第一个下标

  1. private int findFirst(int[] nums, int target){
  2. int left = 0, right = nums.length-1;
  3. while(left<right){
  4. int mid = left + (right - left)/2;
  5. // mid左边元素被排除,left = mid + 1
  6. if(nums[mid] < target){
  7. left = mid + 1;
  8. }else{
  9. right = mid;
  10. }
  11. }
  12. return left;
  13. }

查找元素的最后一个下标

  1. private int findLast(int[] nums, int target){
  2. // 避免死循环
  3. int left = 0, right = nums.length-1;
  4. while(left<right){
  5. int mid = left + (right - left + 1)/2;
  6. // mid右边元素被排除,right = mid - 1
  7. if(nums[mid] > target){
  8. right = mid - 1;
  9. }else{
  10. left = mid;
  11. }
  12. }
  13. return left;
  14. }

image.png
image.png
注意:mid = L+(R-L+1)/2 对于偶数个数,会停在中间右侧,而mid = L+(R-L)/2会停在中间左侧
image.png
注意:return k-arr[l]<arr[r]-k?l:r; 谁的结果更接近于0,则选择谁。