「最大化最小值」或者「最小化最大值」采样二分

分割数组的最大值

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。

设计一个算法使得这 k 个子数组各自和的最大值最小


思路:段数分的越多,最大值就越小,从不分段开始找,l为Math.max(mx-1, (sum-1)/k),r为sum。检验分段是否小于mid,小于r=mid。大于l=mid。
检验是否满足mid为前面的数字和sum不大于mid且段落数小于k。

class Solution {
   
    public int splitArray(int[] nums, int k) {
   
        int sum = 0;
        int mx = 0;
        for(int x:nums) {
   
            sum += x;
            mx = Math.max(mx, x);
        }

        int left = Math.max(mx-1, (sum-1)/k);

        int right = sum;

        while(left+1<right) {
   
            int mid = left + (right-left) / 2;
            if(check(nums, k, mid)) {
   
                right = mid;
            } else {
   
                left = mid;
            }
        }
        return right;
    }

    private boolean check(int[] nums, int k, int mx) {
   
        int cnt = 1;
        int s = 0;
        for(int x:nums) {
   
            if(s+x<=mx) {
   
                s +=x;
            } else {
   
                if(cnt == k) return false;
                cnt +=1;
                s = x;
            }
        }
        return true;
    }
}

相关推荐

  1. 双向冒泡法,可以只求

    2024-01-21 19:06:03       38 阅读
  2. 滑动窗口区间模板

    2024-01-21 19:06:03       28 阅读
  3. 线段树模板

    2024-01-21 19:06:03       22 阅读
  4. 二分-力扣-打家劫舍4

    2024-01-21 19:06:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-21 19:06:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-21 19:06:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-21 19:06:03       82 阅读
  4. Python语言-面向对象

    2024-01-21 19:06:03       91 阅读

热门阅读

  1. web学习笔记(十七)

    2024-01-21 19:06:03       55 阅读
  2. Linux C语言开发(五)程序语句

    2024-01-21 19:06:03       47 阅读
  3. source-map解析源码

    2024-01-21 19:06:03       56 阅读
  4. MySQL 常用函数介绍

    2024-01-21 19:06:03       58 阅读
  5. 客户需求,就是项目管理中最难管的事情

    2024-01-21 19:06:03       59 阅读
  6. MYSQL--count(*) 和 count(1)和count(列名)区别

    2024-01-21 19:06:03       50 阅读