复杂的二分题目难点
第 410、1011、1482、1552、1760、2187、2226 题
1 根据题意确定二分的数据范围
2 避免死循环: 决定是int m = (left+right+1)/2还是int m = (left+right)/2
3 返回结果的指针是left还是right
1 LC875. 爱吃香蕉的珂珂
class Solution {public int minEatingSpeed(int[] piles, int h) {int n=piles.length;int r=1;for(int p:piles){r=Math.max(r,p);}int l=1;while(l<=r){int m=(l+r)>>1;long cntH=getTime(piles,m);if(cntH<=h){r=m-1;}else{l=m+1;}}return l;}public long getTime(int[] piles, int speed) {long res=0l;for(int t:piles){res+=Math.ceil(t*1.0/speed); }return res;}}
2 LC1011. 在 D 天内送达包裹的能力
1 LC274. H 指数
public int hIndex8(int[] citations) {int left=0,right=citations.length;int mid=0,cnt=0;while(left<right){// +1 防止死循环mid=(left+right+1)>>1;cnt=0;for(int i=0;i<citations.length;i++){if(citations[i]>=mid){cnt++;}}if(cnt>=mid){// 要找的答案在 [mid,right] 区间内left=mid;}else{// 要找的答案在 [0,mid) 区间内right=mid-1;}}return left;}public int hIndex(int[] citations) {int n=citations.length;int ans=0;int maxCnt=0;int l=0,r=n;while(l<=r){int m=(l+r)>>1;int cnt=0;for(int i=0;i<n;i++){if(citations[i]>=m){cnt++;}}if(cnt>=m){l=m+1;}else{r=m-1;}}return l-1;}