面试高频算法题补充系列:木棍切割问题
前言
了解更多常考高频算法题可以关注
公众号:一个搬砖的胖子
高频算法网站:https://codetop.cc/
小程序:CodeTop
此题经常在字节跳动后端面试中遇到,尤其是教育部门的三面。我押一包辣条,之后面试还会考察这道题。
题目描述
给定长度为n的数组,每个元素代表一个木头的长度,木头可以任意截断,从这堆木头中截出至少k个相同长度为m的木块。已知k,求max(m)。
输入两行,第一行n, k,第二行为数组序列。输出最大值。
输入
5 5
4 7 2 10 5
输出
4
解释:如图,最多可以把它分成5段长度为4的木头
ps:数据保证有解,即结果至少是1。
题目分析
方法一:暴力。大概思路就是从1遍历到木棍最长的长度,每次遍历的长度作为m,如果可以将所有木头截出来k个长度为m的木块,则更新最大值,最后输出最大值即可。可以通过下面的伪代码片段
辅助理解:
// input n, k;
int maxV = max(a[0 ~ n - 1]);
int res = 0;
while (1 <= maxV)
{int cnt = 0;for (int i = 0; i < n; i ++ ) cnt += a[i] / m;if (cnt >= k) res = max(res, cnt); // 如果当前可以截出来超过k段,就更新结果m ++;
}cout << res << endl;
时间复杂度也很容易看出来是O(n * len), len为木头中最大的长度。容易想到遍历长度时可以从大到小遍历,if (cnt >= k)
成立,则该值即为最终结果,可直接break,但最坏时间复杂度没变。
方法二:二分。方法一在[1,max]寻找最大长度时是顺序遍历,由于其有序,我们可借助二分来快速检出结果。如果能截出来k个长度为x的木块,说明答案肯定 >= x,则接下来只需在[x,max]中找m最大满足条件的长度。反之则说明答案 < x,则在[1,x-1]中寻找结果。这样我们每次可以舍弃1/2的情况,因此使用二分的时间复杂度是O(n * log Len)。
#include <iostream>
using namespace std;const int N = 100010;
int a[N];
int n, k;
int check(int mid)
{int res = 0;for (int i = 0; i < n; i ++ ) res += a[i] / mid;return res;
}
int main()
{cin >> n >> k;int l = 1, r = -1;for (int i = 0; i < n; i ++ ){cin >> a[i];r = max(r, a[i]);}while (l < r){int mid = l + r + 1 >> 1;if (check(mid) >= k) l = mid;else r = mid - 1;}cout << l << endl;return 0;
}
面试高频算法题补充系列:木棍切割问题相关推荐
- 面试高频算法题补充系列:如何判断一个点是否在三角形内?
前言 了解更多常考高频算法题可以关注 公众号:一个搬砖的胖子 企业面试题库:https://codetop.cc/ 小程序:CodeTop 该题曾出现在字节跳动.腾讯.网易.美团.小马智行等公司的面试 ...
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
排序 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率. 对于排序: 我 ...
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必知必会 排序 + 二叉树 部分!
排序 时光小说网 https://wap.youxs.org/ 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序.这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后 ...
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 字符串处理+动态规划 合集!
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!
链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...
- Leetcode高频算法题——字节跳动篇
众所周知,字节跳动面试非常喜欢考算法题. Leetcode官方的企业题库不仅付费,而且题量非常大. 因此,我从20年7月开始,手动整理牛客面经涉及的Leetcode算法题,并按照频度由高到低进行了排列 ...
- 大厂敲门砖——算法,手撸3道高频算法题,检测真水平
3道高频算法题 手撸算法1:查找数组中重复元素和重复元素的个数 手撸算法2:写个二分查找demo吧 手撸算法3:把两个有序数组合并成一个有序数组 要进大厂,算法是不可或缺的一环,也是块儿敲门砖,科一都 ...
- 2019多益笔试编程和面试的算法题
2019多益笔试编程和面试的算法题 多益网络笔试编程题:字符串的指定位数组合 原题概述(只记得大概): 题目解答 多益网络面试算法题:不用比较找出两数中的较大值和较小值 原题概述: 题目解答 代码示例 ...
- 字节跳动3月面试遇到的高频算法题
本文汇总了牛客2021.3.1~2021.3.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...
最新文章
- 平板电脑安装软件_题宝典软件升级了,微信公众号版不受影响,电脑版/手机APP/平板APP需要重新下载安装...
- add1顶部菜单html,add1.html
- boost::mp11::mp_none_of相关用法的测试程序
- python 知乎接口_Python采用Django制作简易的知乎日报API
- 【Android OpenGL ES 开发 (零)】创建一个新的工程
- 146. LRU缓存机制
- CentOS 7 各个版本的区别
- TIOBE 9 月编程语言:C++ 突起、Java 流行度下降
- 前端 new实例后销毁实例_后浇带怎么做不漏浆?看个实例
- final阶段成员贡献分
- angularjs绑定属性_AngularJS隔离范围属性绑定教程
- NSURLSession访问HTTPS网站
- 关于应用程序无法启动,因为应用程序的并行配置不正确的解决办法
- 微信小程序注册教程-详细图文教程
- PostgreSQL 中的系统字段:tableoid、xmin、xmax、cmin、cmax、ctid
- 关于电脑版/PC微信如何恢复聊天记录【实践可行】
- 水果销售系统功能设计
- 弱爆了的鹊桥专用查询接口:taobao.tbk.dg.item.coupon.get( 好券清单API【导购】)接口
- Java的生成随机数
- 10组团队项目-Alpha冲刺-4/6