• 算法二分


    左神 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;
        }
    }
  • 相关阅读:
    Shell判断文件或目录是否存在
    linux使用wpa_supplicant手动配置wifi
    ubuntu更换apt源后依然搜索旧软件源下载失败问题
    在Ubuntu下解决E: 无法对目录 /var/lib/apt/lists/ 加锁的问题
    Bash中判断一个命令的输出结果是否为空
    [解决]/bin/bash^M: bad interpreter: No such file or directory
    【转】 使用 NetworkManager 命令行工具 nmcli
    【转】wpa_supplicant及wpa_cli使用方法
    [RK3288] Vendor Storage区域知识及探讨
    安装oracle 时“[INS-30014]无法检查指定的位置是否位于 CFS上”问题
  • 原文地址:https://www.cnblogs.com/t1314/p/15756274.html
Copyright © 2020-2023  润新知