关注
个人注解:
/*主函数*/{
// 首先找出整个数组中的两个最值
for(int num : nums){
max = Math.max(max, num);
min = Math.min(min, num);
}
// 这里是采用了二分的思路,因为段的不平衡度是非严格递增的(重点),也就是有序的,故可以使用二分法
// left为0,即平衡度的最小值;right为max-min,即段为整个数组时的平衡度,此时拆分后的段的平衡度不可能超过这个值
int l = 0, r = max - min, m = 0;
while(l < r){
m = (l + r) / 2;
// 检查平衡度小于等于m的段是否存在,若存在,我们缩小右边界,看看是否存在更小的平衡度
if(check(nums, k, m)) r = m;
// 若不存在,说明需要往大于m的方向寻找
else l = m + 1;
}
// 因为left是从0开始的,而且每次只递增1,那么最后跳出时就是我们所求的结果
System.out.println(l);
}
// 是否存在满足平衡度<=x的最长的段
boolean check(int[] nums, int k, int x){
int max = nums[0], min = nums[0];
for(int i=1; i < nums.length; i++){
max = Math.max(max, nums[i]);
min = Math.min(min, nums[i]);
// 当平衡度大于x时,开启下一个段,看是否存在更小的平衡度。直到达到段数的限制,则返回false
if(max - min > x){
k--;
if(k <= 0) return false;
max = min = nums[i];
}
}
return k > 0;
}
查看原帖
5 3
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 什么是优秀的实习经历 #
8463次浏览 211人参与
# 实习简历求拷打 #
12748次浏览 160人参与
# 被上班搭子“传染”了哪些习惯 #
5624次浏览 99人参与
# 秋招被挂春招仍然能投的公司 #
6882次浏览 99人参与
# 工作后,你落下了哪些病根 #
13570次浏览 190人参与
# mt对你说过最有启发的一句话 #
36226次浏览 429人参与
# 外包能不能当跳板? #
54117次浏览 256人参与
# 作业帮求职进展汇总 #
83156次浏览 547人参与
# 摸鱼被leader发现了怎么办 #
101573次浏览 644人参与
# 秋招特别不鸣谢 #
15812次浏览 177人参与
# 考研失败就一定是坏事吗? #
201169次浏览 1373人参与
# 选实习,你更看重哪方面? #
14212次浏览 217人参与
# 投格力的你,拿到offer了吗? #
152676次浏览 817人参与
# 第一次面试 #
1036521次浏览 13683人参与
# 今年秋招你收到了多少封邮件? #
18055次浏览 219人参与
# 京东美团大战,你怎么看? #
158126次浏览 860人参与
# 机械/制造每日一题 #
80267次浏览 1411人参与
# 担心入职之后被发现很菜怎么办 #
266310次浏览 1133人参与
# 你今年的保底offer是哪家 #
155181次浏览 673人参与
# 携程求职进展汇总 #
840269次浏览 5536人参与
