算法二分

左神 step num

给定一个正整数,判断它是否是某个数的step num

680的step num为680+68+6

if a<b,则 stepnum(a)<stepnum(b)

class Solution {
    boolean f(int x) {
        int l = 0, r = x;
        while (l <= r) {
            int m = l + ((r - l) >> 1);
            if (check(m) == x) {
                return true;
            } else if (check(m) < x) {
                l = m + 1;
            } else {
                r = m - 1;
            }
        }
        return false;
    }

    private int check(int x) {
        int ans = 0;
        while (x != 0) {
            ans += x;
            x /= 10;
        }
        return ans;
    }
}

左神 胡广燕吃香蕉

有n堆香蕉

piles[i]表示第i堆香蕉的个数

警卫将会离开h小时

胡广燕吃香蕉的速度为k(单位:根/小时)

如果这堆香蕉少于k根,她将吃掉所有香蕉,一小时之后,才可以吃其他堆的香蕉

返回她可以在h小时内吃掉所有香蕉的最小速度k

if a<b,则check(a)>=check(b)   check(a)表示胡广燕吃香蕉的速度为a,吃完所有香蕉要几个小时

class Solution {
    /**
     * @param arr 每堆香蕉的数量
     * @param h   警卫离开h小时
     * @return 胡广燕吃完所有香蕉的最小速度
     */
    int f(int[] arr, int h) {
        //1
        int l = 0, r = Integer.MIN_VALUE, ans = 0, n = arr.length;
        for (int i = 0; i < n; i++) {
            r = Math.max(r, arr[i]);
        }
        //2
        while (l <= r) {
            int m = l + ((r - l) >> 1);
            //compare with h
            if (check(m, arr) == h) {
                ans = m;
                r = m - 1;
                //valid
            } else if (check(m, arr) < h) {
                //smaller
                r = m - 1;
            } else {
                r = m - 1;
            }
        }
        return ans;
    }

    /**
     * @param m   每小时吃m个香蕉
     * @param arr 每堆香蕉的数量
     * @return
     */
    private int check(int m, int[] arr) {
        int ans = 0;
        for (int i = 0; i < arr.length; i++) {
            ans += (arr[i] + m - 1) / m;
        }
        return ans;
    }
}

左神 完成所有画作所需要的最少时间

arr[i]表示完成第i幅画需要的时间

num表示画匠的数量

每个画匠只能画连在一起的画作

所有的画家并行工作

返回完成所有画作所需要的最少时间

if a<b,则check(a)>=check(b)   check(a)表示要在a个小时内完成所有画作,需要几个画匠

class Solution {
    /**
     * @param arr arr[i]表示完成第i幅画需要的时间
     * @param num 画匠的数量
     * @return 完成所有画作的最少时间
     */
    int f(int[] arr, int num) {
        //1
        int l = Integer.MIN_VALUE, r = 0, ans = 0;
        for (int i = 0; i < arr.length; i++) {
            l = Math.max(l, arr[i]);
        }
        for (int i = 0; i < arr.length; i++) {
            r += arr[i];
        }
        //2
        while (l <= r) {
            int m = l + ((r - l) >> 1);
            //compare with num
            if (check(m, arr) == num) {
                ans = m;
                r = m - 1;
                //valid
            } else if (check(m, arr) < num) {
                r = m - 1;
            } else {
                l = m + 1;
            }
        }
        return ans;
    }

    /**
     * @param m   要在m小时内完成所有画作
     * @param arr
     * @return 要在m小时内完成所有画作,需要的画匠的数量
     */
    public int check(int m, int[] arr) {
        int ans = 0, sum = 0;
        for (int i = 0; i < arr.length; i++) {
            if (sum + arr[i] == m) {
                ans++;
                sum = 0;
            } else if (sum + arr[i] < m) {
                sum += arr[i];
            } else {
                ans++;
                sum = arr[i];
            }
        }
        if (sum > 0)
            ans++;
        return ans;
    }
}
原文地址:https://www.cnblogs.com/t1314/p/15756274.html