2018-06-18 lintCode 183 Wood Cut

Description

Given n pieces of wood with length L[i] (integer array). Cut them into small pieces to guarantee you could have equal or more than k pieces with the same length. What is the longest length you can get from the n pieces of wood? Given L & k, return the maximum length of the small pieces.

中文描述:有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。

Example
For L=[232, 124, 456], k=7, return 114.

解题思路
这道题根据题意, 发现是在一个范围里面求取最大值, 也就是一段木头的最大长度。 那么可以考虑用二分法来解决问题。 那么二分法 左边边界考虑为1。 因为分木头最短的长度(整数)就是1。 最大值应该是数组里的最大值。 既然有了两个边界那么就可以套用二分法的模板了:

int start 1 , end = max;    // 1. 找到可行解范围
while(start + 1 < end)
{
int mid = start + (end - start) / 2;  // 2. 猜答案
if(check(mid)){                      // 3. 检验答案
  start = mid;                        // 4. 调整搜索范围
}else
{
  end = mid;                        // 4. 调整搜索范围
}
}

具体代码如下:

public class Solution {
        /**
         * @param L: Given n pieces of wood with length L[i]
         * @param k: An integer
         * @return: The maximum length of the small pieces
         */
        public int woodCut(int[] L, int k) {
            // write your code here
            int start = 1;
            int end = 0;
            for(Integer item : L)
            {
                end = Math.max(end, item);
            }

            while(start + 1 < end)
            {
                int mid = start + (end - start) / 2;
                if(count(L, mid) >= k)
                    start = mid;
                else
                    end = mid;

            }

            if(count(L, end) >= k)
                return end;

            if(count(L, start) >= k)
                return start;

            return 0;

        }

        public int count(int[] L, int len)
        {
            int sum = 0;
            for(int item : L)
            {
                sum += item / len;
            }
            return sum;
        }
    }

count 函数是用来判断所猜的答案是否正确的 因为要分木头 k是份数 长度是mid。 如果可以分 那么返回的sum应该要大于或者等于k, 这样说明长度小了 移到start。 如果小于k, 说明长度分大了, 那么移动end。 最后加两个判断 判断到底是该返回start还是该返回end。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,737评论 0 38
  • 在以前有一个县城的漕运很混乱,一个姓赶的河官想出了一个主意,所有漕运的人必须在县里去领通行牌,在大多数人去领牌的时...
    Todd_雲轩阅读 2,720评论 0 4
  • 以前总以为天下最好听的情话,就是跟你一起走到了今天,还能让你知道我比初见钟情更喜欢你,我知道有时候你会觉得自己脾气...
    9b1dea877f9c阅读 916评论 0 0
  • 青砖老宅 庭中大树 树下少年 夜深忽梦少年事 唏嘘了多少青春 多少年以后 炉火旁打盹 绿草如茵 蹒跚的步履 流连忘...
    姓海的姑娘阅读 1,014评论 0 0
  • 究竟那是什么人?在外面的声音 只可能在外面。你的心地幽深莫测 青苔的井边有棵铁树,进了门 为何你不来找我,只是溜向...
    慕容兰馨阅读 1,176评论 0 2