什么是二分查找
二分查找的基本原则
三大模板
查找元素的第一个下标
private int findFirst(int[] nums, int target){int left = 0, right = nums.length-1;while(left<right){int mid = left + (right - left)/2;// mid左边元素被排除,left = mid + 1if(nums[mid] < target){left = mid + 1;}else{right = mid;}}return left;}
查找元素的最后一个下标
private int findLast(int[] nums, int target){// 避免死循环int left = 0, right = nums.length-1;while(left<right){int mid = left + (right - left + 1)/2;// mid右边元素被排除,right = mid - 1if(nums[mid] > target){right = mid - 1;}else{left = mid;}}return left;}


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