木头加工

题目描述

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

注意事项

木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。

样例

有3根木头[232, 124, 456]k=7, 最大长度为114,则返回114

简单分析

暴力解法就是从1开始遍历所有的长度,对于长度L,计算所有木头可以切多少段,如果满足要求就记录长度并继续增加,如果不满足则终止循环,并返回记录的长度L。

暴力解法的复杂度是O(n*m)其中n是木头数组的长度,m指的是数组中数据最大值,因为对于每一个长度都需要遍历整个数组,而最后的数组大小基本正比于数组中的最大值。

在暴力解法的基础上,我们可以改进为O(n*log m)复杂度的算法,先找到最长的木头长度maxl(数组中的最大值),然后利用二分法搜索0-maxl之间的值,最后输出满足要求的最大值。

程序

public int woodCut(int[] L, int k) {int l = L.length;if(l == 0) return 0;     //如果输入数组L为空则直接返回0int maxL = L[0];               //找到数组中的最大值for(int i = 1; i < l; i++){int temp = L[i];if(temp > maxL){maxL = temp;}}int up = maxL;int down = 0;int res = 0;while(up >= down){               //二分法查找int len = down + (up - down)/2;if(len == 0) return 0;int c = count(L,len);if(c >= k) {res = res>=len?res:len;down = len + 1;}   //符号是>=else if(c < k) up = len - 1;}return res;}public int count(int[] L,int length){int num = 0;for(int l:L){num += l/length;}return num;}
}

上面的算法运行速度仍然很慢,在lintcode网站提交以后运行时间是3s以上,很慢。大家可以试着优化一下。

ps:提供一个教训,我是想法是,当最后分割的长度正好是k段时,我再更新最终的结果长度res。也就是把二分搜索部分修改如下

 while(up >= down){int len = down + (up - down)/2;if(len == 0) return 0;int c = count(L,len);if(c < k) up = len - 1;else{ if(c == k) res = res>=len?res:len; down = len + 1;}}    

首先,上面这个程序是错误的。如果最大值对应的段数不是k的话,那我们的程序就无法输出正确结果。这是我个人尝试中的一点经验。

一些闲话:

博客这边更新的题目都是略带难度的,还有一些只需要简单技巧的题目就不在这里写了,尽量写在github上了。一个不算项目的小项目,现在内容还比较少,大家喜欢可以支持一下。

转载于:https://www.cnblogs.com/GuoYaxiang/p/6127404.html

【刷题笔记】--lintcode木头加工(java)相关推荐

  1. java二叉树转换为链表_leetcode刷题笔记-114. 二叉树展开为链表(java实现)

    leetcode刷题笔记-114. 二叉树展开为链表(java实现) 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 rig ...

  2. 牛客网java刷题笔记2019-1-4

    牛客网java刷题笔记 2019-1-4 1.java中可以用类中构造器调用其他类构造器(这个和C++中构造函数很类似)用于初始化程序变量值, 构造器和方法的区别: 功能和作用的不同 构造器是为了创建 ...

  3. leetcode刷题java、c++、go语言三合一版本 谷歌师兄的刷题笔记、东哥的算法小抄、 Guide哥的Java面试突击版

    不久前火爆 GitHub 的 LeetCode 中文刷题手册,分享给大家,让正在找工作的朋友能够快速找到心仪的offer! <LeetCode Cookbook>目前已经收录了 520 道 ...

  4. 我收藏的谷歌和阿里大佬的刷题笔记

    金三银四大家在准备校招.社招,或者闲暇的时候,都可以刷刷 Leetcode,保持良好的手感. 之前刷题,一直觉得漫无目的地刷,效率很低.后来发现了两个刷题笔记,谷歌大佬高畅和BAT大佬霜神写的 Lee ...

  5. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  6. 《编程能力基础》刷题笔记(41 题)

    <编程能力基础>刷题笔记 1. 单调数列 题解:递归.模拟.API 2. 实现 strStr() 题解:API.暴力.滑动窗口 3. 平衡二叉树 题解:迭代 4. 重复的子字符串 题解:模 ...

  7. LeetCode《编程能力入门》刷题笔记(34 题全)

    LeetCode<编程能力入门>刷题笔记 基本数据类型 1. 在区间范围内统计奇数数目 _解法1:暴力迭代 _解法2:数学(找规律) 2. 去掉最低工资和最高工资后的工资平均值 _解法1: ...

  8. 《剑指 Offer I》刷题笔记 51 ~ 61 题

    <剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...

  9. 《剑指 Offer I》刷题笔记 41 ~ 50 题

    <剑指 Offer I>刷题笔记 41_50 排序(中等) 41. 最小的k个数# _解法1:排序 API + 数组复制 API 42. 数据流中的中位数 _解法1:暴力 搜索和回溯算法( ...

  10. 《剑指 Offer I》刷题笔记 20 ~ 30 题

    <剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...

最新文章

  1. 立体视觉动态测量技术
  2. HttpApplication IHttpAsyncHandler, IHttpHandler, IComponent, IDisposable ps url System.Web.dll
  3. 适合做公安网的php,gonganbeian.php
  4. 深度学习 Deep Learning with MATLAB(懒人版)
  5. Log4j 1使用教程
  6. SQL Server 索引使用和优化
  7. 超市买苹果变量的定义和使用
  8. Javascript设计模式
  9. netflix_Netflix的Polynote
  10. 优化技巧一、UITableView加载图片
  11. C/C++常量数据类型
  12. pip慢?半分钟解决方案
  13. 《Fortran 95 程序设计》阅读笔记三
  14. java 代码走查_java代码走查计划书
  15. 计算机技术和通信技术的关系,计算机技术与通信技术的关系
  16. android技巧:dumpsys简化信息查看Activity结构
  17. Veil-Evasion免杀
  18. [SLAM基础学习简记]非线性优化
  19. mahout实现协同过滤推荐算法
  20. MacBook解决控制台图标问题

热门文章

  1. POJ2404:Jogging Trails
  2. CDH5.15.0+spark1.6.0+hive1.1集群与zeppelin0.8.1+spark-notebook打通踩坑总结
  3. C++中对字符串的操作
  4. ExpandableListView的箭头问题
  5. 微信小程序开发多少钱 怎么看价格成本
  6. Kaggle超市客户分类-KMeans无监督案例
  7. 多模态理论张德禄_学术会议 | 适用语言学与多模态国际会议
  8. c 语言指针数组长度,c如何获取指针数组的长度?
  9. Google Earth Engine(GEE)——哥白尼大气监测 (CAMS) 全球气溶胶AOI近实时观测数据集
  10. 情感分析的一些专业术语