关注
个人注解:
/*主函数*/{
// 首先找出整个数组中的两个最值
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
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我的实习收获 #
14469次浏览 282人参与
# 穿越回高考你还会选现在的专业吗 #
11176次浏览 162人参与
# 实习吐槽大会 #
17329次浏览 80人参与
# 我的租房踩坑经历 #
6745次浏览 118人参与
# 晒一晒你的工位 #
80912次浏览 287人参与
# 打工人锐评公司红黑榜 #
144530次浏览 892人参与
# 提前批过来人的忠告 #
102344次浏览 1114人参与
# 毕业旅行去哪玩儿 #
377次浏览 17人参与
# 非技术er求职现状 #
58223次浏览 428人参与
# 高学历就一定能找到好工作吗? #
47400次浏览 585人参与
# 运营/市场营销人的秋招现状 #
16641次浏览 186人参与
# 携程求职进展汇总 #
522728次浏览 3838人参与
# 你想对下半年说点什么 #
22424次浏览 209人参与
# 你投递的公司有几家约面了? #
104048次浏览 746人参与
# 工作压力大怎么缓解 #
78635次浏览 934人参与
# 运营人求职交流聚集地 #
133320次浏览 978人参与
# 你最满意的offer薪资是哪家公司? #
25574次浏览 132人参与
# 选完offer后,你后悔学机械吗? #
28971次浏览 160人参与
# 实习中的菜狗时刻 #
363102次浏览 3285人参与
# 今年形式下双非本找得到工作吗 #
139174次浏览 1062人参与