publicintminEatingSpeed(int[] piles, int h) { int l=1; intr=0; for (int i : piles) { r = Math.max(r,i); } intans= r; while(l<=r){ intmid= l + ((r-l)>>1); if(fMinEatingSpeed(piles,mid) <= h){ ans = mid; r = mid-1; }else { l = mid+1; } } return ans; }
publicstaticintsplitArray(int[] nums, int k) { longsum=0; for (int num : nums) { sum += num; } longans=0; // [0,sum]二分 for (longl=0, r = sum, m, need; l <= r;) { // 中点m m = l + ((r - l) >> 1); // 必须让数组每一部分的累加和 <= m,请问划分成几个部分才够! need = f(nums, m); if (need <= k) { // 达标 ans = m; r = m - 1; } else { l = m + 1; } } return (int) ans; }
// 必须让数组arr每一部分的累加和 <= limit,请问划分成几个部分才够! // 返回需要的部分数量 publicstaticintf(int[] arr, long limit) { intparts=1; intsum=0; for (int num : arr) { if (num > limit) { return Integer.MAX_VALUE; } if (sum + num > limit) { parts++; sum = num; } else { sum += num; } } return parts; }
publicstaticintsmallestDistancePair(int[] nums, int k) { intn= nums.length; Arrays.sort(nums); intans=0; // [0, 最大-最小],不停二分 for (intl=0, r = nums[n - 1] - nums[0], m, cnt; l <= r;) { // m中点,arr中任意两数的差值 <= m m = l + ((r - l) >> 1); // 返回数字对的数量 cnt = f(nums, m); if (cnt >= k) { ans = m; r = m - 1; } else { l = m + 1; } } return ans; }
// arr中任意两数的差值 <= limit // 这样的数字配对,有几对? publicstaticintf(int[] arr, int limit) { intans=0; // O(n) for (intl=0, r = 0; l < arr.length; l++) { // l......r r+1 while (r + 1 < arr.length && arr[r + 1] - arr[l] <= limit) { r++; } // arr[l...r]范围上的数差值的绝对值都不超过limit // arr[0...3] // 0,1 // 0,2 // 0,3 ans += r - l; } return ans; }
同时运行n台电脑的最长时间
leelcode2141
你有 n 台电脑。给你整数 n 和一个下标从 0 开始的整数数组 batteries ,其中第 i 个电池可以让一台电脑 运行 batteries[i] 分钟。你想使用这些电池让 全部 n 台电脑 同时 运行。