脉脉上的一道字节算法题

460 阅读1分钟

image.png

刷脉脉时看到的,非leetcode原题。自己试着写了下,不是很难。特此记录下

思路

思路很简单,max(m)必然大于最小的木头的长度,小于最大的木头长度。使用二分法求解即可。唯一需要注意的是,如果我们找出了符合k的长度,还是需要继续查找。因为题目中的要求是至少k个。

二分法

const getMaxLength = (arr, k) => {
    let m = 0;
    arr = arr.sort((a, b) => a - b)

    const binarySearch = (start, end) => {
        if (start <= end) {
            const len = Math.floor(((start + end) / 2))
            let count = 0
            for (let i = 0; i < arr.length; i++) {
                count += Math.floor(arr[i] / len)
            }
            if (count >= k) {
                m = Math.max(m, len)
                binarySearch(len + 1, end)
            } else {
                binarySearch(start, len - 1)
            }
        }
    }

    binarySearch(arr[0], arr[arr.length - 1])

    return m
}