• 数组分段和最大值的最小值问题


    题目

    给定一个数组,将其分为 k 段,对每一段求和,并求得最大值 max。

    求在所有的分段方案中,max 的最小值。

    代码

    public class Main {
    
        public static int getMax(int array[], int n) {
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < n; i++) {
                if (array[i] > max) max = array[i];
            }
            return max;
        }
    
        public static int getSum(int array[], int n) {
            int total = 0;
            for (int i = 0; i < n; i++)
                total += array[i];
            return total;
        }
    
        /**
         * 当所有段的最大值为 maxLengthPerPainter 时,返回最少可以将其分为多少段
         */
        public static int getRequiredPainters(int array[], int n, int maxLengthPerPainter) {
            int total = 0, numPainters = 1;
            for (int i = 0; i < n; i++) {
                total += array[i];
                if (total > maxLengthPerPainter) {
                    total = array[i];
                    numPainters++;
                }
            }
            return numPainters;
        }
    
        public static int binarySearch(int array[], int n, int k) {
            /**
             * low 代表所有分段中的最小段的值
             * high 代表所有分段中的最大段的值
             */
            int low = getMax(array, n);
            int high = getSum(array, n);
    
            while (low < high) {
                int mid = low + (high - low) / 2;
                int requiredPainters = getRequiredPainters(array, n, mid);
                if (requiredPainters <= k)
                    high = mid;
                else
                    low = mid + 1;
            }
            return low;
        }
    
        public static void main(String[] args) {
            int k = 3;
            int[] a = {9, 4, 5, 12, 3, 5, 8, 11, 0};
            System.out.println(binarySearch(a, a.length, k));
        }
    }
    
  • 相关阅读:
    Navicat将表转为模型
    RestTemplate Hashmap变为LinkedHashMap源码解读
    IDEA无法编译源码,IDEA查看源码出现/* compiled code */
    grep,egrep,正则表达式
    特殊权限
    更新系统硬件信息----光驱
    复制其他文件的权限做为自己的权限
    umask
    生成随机口令
    让新增用户默认拥有文件
  • 原文地址:https://www.cnblogs.com/debugxw/p/11461746.html
Copyright © 2020-2023  润新知