當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

算法-二分
2022-01-01 23:12:18

左神 step num

給定一個(gè)正整數(shù),判斷它是否是某個(gè)數(shù)的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堆香蕉的個(gè)數(shù)

警衛(wèi)將會(huì)離開(kāi)h小時(shí)

胡廣燕吃香蕉的速度為k(單位:根/小時(shí))

如果這堆香蕉少于k根,她將吃掉所有香蕉,一小時(shí)之后,才可以吃其他堆的香蕉

返回她可以在h小時(shí)內(nèi)吃掉所有香蕉的最小速度k

if a<b,則check(a)>=check(b)? ?check(a)表示胡廣燕吃香蕉的速度為a,吃完所有香蕉要幾個(gè)小時(shí)

?

class Solution {
    /**
     * @param arr 每堆香蕉的數(shù)量
     * @param h   警衛(wèi)離開(kāi)h小時(shí)
     * @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   每小時(shí)吃m個(gè)香蕉
     * @param arr 每堆香蕉的數(shù)量
     * @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;
    }
}

?

?

左神 完成所有畫(huà)作所需要的最少時(shí)間

arr[i]表示完成第i幅畫(huà)需要的時(shí)間

num表示畫(huà)匠的數(shù)量

每個(gè)畫(huà)匠只能畫(huà)連在一起的畫(huà)作

所有的畫(huà)家并行工作

返回完成所有畫(huà)作所需要的最少時(shí)間

if a<b,則check(a)>=check(b)? ?check(a)表示要在a個(gè)小時(shí)內(nèi)完成所有畫(huà)作,需要幾個(gè)畫(huà)匠

class Solution {
    /**
     * @param arr arr[i]表示完成第i幅畫(huà)需要的時(shí)間
     * @param num 畫(huà)匠的數(shù)量
     * @return 完成所有畫(huà)作的最少時(shí)間
     */
    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小時(shí)內(nèi)完成所有畫(huà)作
     * @param arr
     * @return 要在m小時(shí)內(nèi)完成所有畫(huà)作,需要的畫(huà)匠的數(shù)量
     */
    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/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >