leetcode 410. 分割数组的最大值

题目链接: https://leetcode-cn.com/problems/split-array-largest-sum/

题目: 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。

思路: 想半天什么dp,其实就是个常见二分。首先确定答案肯定在avg(nums)到sum(nums)之间,确定上下界,然后二分逼近,对每一个mid值,看能不能分出满足题意的来

代码:

class Solution {
    public int splitArray(int[] nums, int m) {
        long down, up = 0, min_max_val = -1;
        for(int val : nums){
            up += val;
        }
        down = up / m;
        while(down <= up){
            long mid = (up + down) / 2;
            if(check(nums, m, mid)){
                min_max_val = mid;
                up = mid - 1;
            } else {
                down = mid + 1;
            }
        }
        return (int)min_max_val;
    }
    private boolean check(int[] nums, int m, long max_val){
        long sum = 0, count = 1;
        for(int val : nums){
            sum += val;
            if(sum > max_val){
                sum = val;
                count++;
            }
            if(sum > max_val || count > m){
                return false;
            }
        }
        return count <= m;
    }
}

你可能感兴趣的:(二分法)