Leetcode 410. Split Array Largest Sum

来源:互联网 发布:乐其网络骗局 编辑:程序博客网 时间:2024/06/08 06:15

问题描述:

Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays.

Note:
If n is the length of array, assume the following constraints are satisfied:

  • 1 ≤ n ≤ 1000
  • 1 ≤ m ≤ min(50, n)

Examples:

Input:nums = [7,2,5,10,8]m = 2Output:18Explanation: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.

二分搜索,问题特点,如果最大段数值越小,分布越均匀,则所分段数越多,如果最大段数值越大,则所分段数越少,二分查找,逼近最大段的数值。最大段的数值必然不小于数组最大值,也不小于sum/m,并且不大于sum。所以代码如下:

public int splitArray(int[] nums, int m) {        int n=nums.length;        long high=0;        long low=0;        for(int i=0;i<n;i++)        {            high+=nums[i];            if(low<nums[i])                low=nums[i];        }        if(low<high/m)            low=high/m;        long ans=high;        while(low<=high){            long sum=nums[0];            int cnt=1;            long mid=low+(high-low)/2;            boolean flg=true;            for(int i=1;i<n;i++){                sum+=nums[i];                if(sum>mid){                    cnt++;                    sum=nums[i];                }                if(cnt>m){                    flg=false;                    break;                }            }            if(flg)            {                high=mid-1;                ans=mid;            }             else{                low=mid+1;            }        }        return (int)ans;    }

参考链接:http://blog.csdn.net/u014688145/article/details/69525838

原创粉丝点击