classSolution{publicintspecialArray(int[] nums){Arrays.sort(nums);int l =1;int r = nums[nums.length -1];while(l <= r){int mid = l +(r - l)/2;int count =cnt(mid, nums);if(count == mid)return mid;elseif(count < mid) r = mid -1;else l = mid +1;}return-1;}// 用来统计数组中有多少个数是 >= i 的publicintcnt(int i,int[] nums){// 找到排序数组中(第一个 >= i 的数字)// 然后返回 (数组长度) (减去) (第一个 >= i 的数字)int n = nums.length;int l =0;int r = n -1;while(l < r){int mid = l +(r - l)/2;if(nums[mid]< i) l = mid +1;else r = mid;}return n - l;}}
classSolution{publicintshipWithinDays(int[] weights,int days){// 确定二分查找左右边界int left =Arrays.stream(weights).max().getAsInt(), right =Arrays.stream(weights).sum();while(left < right){int mid =(left + right)/2;// need 为需要运送的天数// cur 为当前这一天已经运送的包裹重量之和int need =1, cur =0;for(int weight : weights){if(cur + weight > mid){++need;
cur =0;}
cur += weight;}if(need <= days){
right = mid;}else{
left = mid +1;}}return left;}}
classSolution{publicint[]successfulPairs(int[] spells,int[] potions,long success){int[] ans =newint[spells.length];Arrays.sort(potions);for(int i =0; i < spells.length; i++){int power = spells[i];int left =0;int right = potions.length -1;while(left >=0&& right <= potions.length && left <= right){int mid = left +(right - left)/2;if(1l* power * potions[mid]< success){
left = mid +1;}else{
right = mid -1;}}
ans[i]= potions.length - left;}return ans;}}