分组(二分答案)

分组

http://www.nowcoder.com/questionTerminal/829419bde0e946b6b4fe813ed3972db8

题目描述

链接:https://www.nowcoder.com/questionTerminal/829419bde0e946b6b4fe813ed3972db8?answerType=1&f=discussion

题目中出现最小值最大、最大值最小的描述,一般都是需要二分答案(要求二分的答案具有单调性

以本题为例, 若最终答案为val,那么对于val - 1, val - 2,等等等,所有比val小的值都是可以满足题意的,所以本题答案具有单调性。

答案最小是0,最大时所有元素之和。此为二分的边界

二分的判定为,对于中值val 能否满足将数组分为k段且每段都大于等于val。

由于要求所取的元素是连续的,所以直接累加到>=val即可,统计当所有段的最小值为val时可以将数组分为多少段。 若分成段的个数大于等于k时即满足题意返回true,否则返回false;

public class Solution {
    /**
     * 分组
     * @param n int整型
     * @param k int整型
     * @param a int整型一维数组
     * @return int整型
     */
    public int solve (int n, int k, int[] a) {
        // write code here
        int sum = 0;
        for(int i = 0; i < a.length; i++){
            sum += a[i];
        }
        int l = 0, r = sum;
        while (l < r){
            int mid = (l + r + 1) / 2;
            if(check(k, a, mid)){
                l = mid;
            } else {
                r = mid - 1;
            }
        }
        return l;
    }

    //最小值为val 分成k段是否够满足
    public static boolean check(int k, int[] a, int val){
        int countK = 0;
        int sum = 0;
        for(int i = 0; i < a.length; i++){
            sum += a[i];
            if(sum >= val){
                sum  = 0;
                countK++;
            }
        }
        return countK >= k;
    }
}
全部评论

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务