• Leetcode 410. Split Array Largest Sum (Binary Search经典)


    1. Split Array Largest Sum
      Hard
      8.9K
      184
      Companies
      Given an integer array nums and an integer k, split nums into k non-empty subarrays such that the largest sum of any subarray is minimized.

    Return the minimized largest sum of the split.

    A subarray is a contiguous part of the array.

    Example 1:

    Input: nums = [7,2,5,10,8], k = 2
    Output: 18
    Explanation: There are four ways to split nums into two subarrays.
    The best way is to split it into [7,2,5] and [10,8], where the largest sum among the two subarrays is only 18.
    Example 2:

    Input: nums = [1,2,3,4,5], k = 2
    Output: 9
    Explanation: There are four ways to split nums into two subarrays.
    The best way is to split it into [1,2,3] and [4,5], where the largest sum among the two subarrays is only 9.

    Constraints:

    1 <= nums.length <= 1000
    0 <= nums[i] <= 106
    1 <= k <= min(50, nums.length)

    解法1:Binary Search。
    不过感觉这题题目似乎有问题,应该不是刚好划分成k个组,而是<=k个组都可以。

    class Solution {
    public:
        int splitArray(vector<int>& nums, int k) {
            int n = nums.size();
            int totalSum = 0, maxNum = 0;
            for (auto num : nums) {
                maxNum = max(maxNum, num);
                totalSum += num;
            }
            int start = maxNum, end = totalSum;
            while (start + 1 < end) {
                int mid = start + (end - start) / 2;
                if (numSubArray(nums, mid) <= k) {
                    end = mid;
                } else {
                    start = mid;
                }
            }
            if (numSubArray(nums, start) <= k) return start;
            return end;
        }
    private:
        // return num of subarrays with maximum sum of each subarray
        int numSubArray(vector<int>& nums, int maxSum) {
            int n = nums.size();
            int res = 0, sum = 0;
            for (int i = 0; i < n; i++) {
                sum += nums[i];
                if (sum > maxSum) {
                    sum = nums[i];
                    res ++;
                }
            }
            if (sum > 0) res++;
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    linux上手动安装luasql的包(centos7)
    【Makefile】报错:undefined reference to symbol ‘pthread_spin_init@@GLIBC_2.2.5‘
    sklearn保存和加载模型
    Java继承的格式
    git pull指令报错:error: You have not concluded your merge (MERGE_HEAD exists).
    ArcGIS Maps SDK for JS(一):概述与使用
    计算机网络 3 - 传输层
    哈夫曼树哈夫曼编码知识点
    k8s安全机制
    项目log日志mysql记录,熟悉python的orm框架
  • 原文地址:https://blog.csdn.net/roufoo/article/details/132706290