今天在网上看到一道这样的算法面试题,第一眼就不小心看到了答案的关键字眼“二分”。
乍一看有点不理解,二分一般是在有序的情况下使用,这个数组并非有序,如何二分?

于是有空的时候,重新去网上找到了一个类似的oj题,题目如下,地址我贴在这里,感兴趣的朋友可以去尝试一下。 https://www.luogu.com.cn/problem/P2440

首先采用了最简单的方法,即两重循环暴力解决问题,时间复杂度大约是n²,果不其然有一个测试数据超时了

#include<iostream>
#include<algorithm>
using namespace std;
int main() {int n, k;cin >> n >> k;int nums[n + 10];int min = 1, maxx = 0;for(int i = 0; i < n; i++) {cin >> nums[i];maxx = max(maxx, nums[i]); // 找出最大值}int res = 0;// 从1cm开始截取一直到最大值for(int i = 1; i < maxx; i++) {int cnt = 0;for(int j = 0; j < n; j++) {cnt += nums[j] / i;if(cnt >= k) {res = i;break;}}// 如果截出的数量不足k,则跳出if(cnt < k) {break;}}cout << res << endl;
}

然后我想起了那个关键字眼“二分”,于是思考了一下,采用了二分的方法。
这里所谓的二分,不是二分数组,而是二分能截取的最小值min1厘米和木头最大长度max。最小值到最大值之间肯定是有序的。

首先求出min和max的中间值mid,假设截取每根木头长度为mid,能截取到k根或者超过k根,则说明mid是符合题意的,这时候需要min设置为mid+1,来检查后半段是否有更大的长度,能截取到k根。

当然,如果一开始截取的时候不足k根,那就要将最大值左移,max设置为mid-1,检查前半段是否有满足题意的k。

以下是二分法的C++代码和java代码
C++代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main() {int n, k;cin >> n >> k;int nums[n + 10];int min = 1, maxx = 0;for(int i = 0; i < n; i++) {cin >> nums[i];maxx = max(maxx, nums[i]);}int res = 0;// 二分while(min <= maxx) {int cnt = 0;int mid = (min + maxx) / 2;for(int i = 0; i < n; i++) {cnt += nums[i] / mid;}// 大于等于k根木头,则继续截if(cnt >= k) {min = mid + 1;res = mid;} else if(cnt < k) {// 不足则在[min, mid - 1]继续截maxx = mid - 1;}}cout << res << endl;
}

java代码:

import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();int min = 1, max = 0; int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();max = Math.max(max, nums[i]);}int res = 0;while (min <= max) {int cnt = 0;int mid = (min + max) / 2;for (int i = 0; i < n; i++) {cnt += nums[i] / mid;}if (cnt >= k) {min = mid + 1;res = mid;} else if (cnt < k) {max = mid - 1;}}System.out.println(res);}
}

本人小白一枚,如果大佬们有更好的方法,希望可以为我指点迷津。

算法面试题:切割木头,给定一个数组nums,nums[i]表示每个木头的长度,木头可以截断,现在需要k根长度一样的木头,每根木头最大长度为多少相关推荐

  1. 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]

    [来源]:腾讯2013实习生笔试   给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂 ...

  2. 力扣高频|算法面试题汇总(七):树

    力扣高频|算法面试题汇总(一):开始之前 力扣高频|算法面试题汇总(二):字符串 力扣高频|算法面试题汇总(三):数组 力扣高频|算法面试题汇总(四):堆.栈与队列 力扣高频|算法面试题汇总(五):链 ...

  3. 每日算法面试题,大厂特训二十八天——第十四天(数组)

    本文来源于算法面试题特训专栏,这里有大量专业性的算法题比如(动态规划21天,大厂特训28天等等) 欢迎大家一起学习. 链接:传送门 目录标题 导读 算法特训二十八天 面试题 点击直接资料领取 导读 肥 ...

  4. 谷歌给 Max Howell 出的一个简单算法面试题:翻转二叉树

    这个问题是谷歌给 Max Howell 出的一个算法面试题 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了. 谷歌给 Max ...

  5. 微软的100道算法面试题(终结版)

    前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...

  6. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  7. [Z]谷歌(Google)算法面试题

    谷歌(Google)算法面试题 1.谷歌面试题:给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 回答:此题的关键是让生成的 1 到 7 的数出现概率相同. 只要我们可 ...

  8. prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  9. 66 道前端算法面试题附思路分析助你查漏补缺

    大家好,我是漫步. 今天来分享一篇干货,前端关于算法的分析不多,下文列举了66道前端算法面试题,希望对你有所帮助. 作者:Eno_Yao https://segmentfault.com/a/1190 ...

  10. 一道亚马逊算法面试题的情景分析

    阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId=1002942008 我们聚焦于一道亚马逊的算法面试题,通过分析该 ...

最新文章

  1. 法国拟将雷诺与日产合并 代表团抵日进行谈判
  2. Git常用命令和Github协同流程
  3. 算法导论Java实现-随机化数组的两种方式(5.3章节)
  4. 微信广告服务器地址,【微信广告服务商平台】微信广告服务商平台运营经验分享!...
  5. 薛定谔的流量杠杆,网红电商上市的激励与诅咒
  6. AC自动机(写的很乱,仅记录留作自己复习)
  7. C++之强制转换const_cast、static_cast、dynamic_cast、reinterpret_cast 、dynamic_cast
  8. 罗技鼠标驱动怎么设置宏?
  9. QT 进程间通信——文件映射
  10. 一文详解:为什么隐私智能合约是Web3的未来
  11. 计算机考研专硕好考还是学硕好考,考研是学硕难考还是专硕难考?很多人都猜错了...
  12. Java图片处理开源框架
  13. 某二级支行网络的设计与实现
  14. 雨课堂知识点总结(十八)
  15. 软件工程(软件计划)
  16. 使用git命令从gitlab下载项目
  17. linux 磁盘缓存设置,Linux下的磁盘缓存
  18. 梦想归梦想,现实还是现实
  19. c语言编程小技巧-if空语句用法
  20. citespace的使用

热门文章

  1. SSRF漏洞修复方案
  2. Assassin暗杀者-自用短小精悍的webshell管理工具分享
  3. 软考知识点之需求管理
  4. 通俗易懂讲解 CAP理论
  5. Minecraft Mod开发环境搭建 | Minecraft 1.15.2 | Forge 31.1.0
  6. 章文嵩博士和他背后的负载均衡(LOAD BANLANCER)帝国
  7. Windows NT引导过程源代码分析(一)
  8. ASML大举向中国出口光刻机,或在于忧虑中国光刻机技术取得突破
  9. 举个栗子!Tableau 技巧(131):用烛台图 Candlestick Chart 分析价格波动
  10. 用前端框架开发一款APP要多少钱