# LC1283 - Find the Smallest Divisor Given a Threshold ## 线性关系 二分查找猜答案 ```java= class Solution { /* x: divisor f(x): f(x) = sum( (num[i] - 1) / x + 1 ) */ public int smallestDivisor(int[] nums, int threshold) { // sanity check // ... int length = nums.length; int minD = 1; // minDivisor int maxD = 0; for (int num : nums) { maxD = Math.max(maxD, num); } while (minD + 1 < maxD) { int midD = minD + (maxD - minD) / 2; if (canGetResultBy(midD, threshold, nums)) { maxD = midD; } else { minD = midD; } } // minimum if (canGetResultBy(minD, threshold, nums)) { return minD; } if (canGetResultBy(maxD, threshold, nums)) { return maxD; } return -1; } // inverse function // f(x) <= target --> right part // smallest x --> left point // boolean function == true --> in the right part --> shrink right bound private boolean canGetResultBy(int targetD, int targetThreshold, int[] nums) { int sum = 0; for (int num : nums) { sum += (num - 1) / targetD + 1; if (sum > targetThreshold) { return false; } } return true; } } ```