国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

410. Split Array Largest Sum

2019-11-11 05:41:35
字體:
來源:轉載
供稿:網友

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

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

1 ≤ n ≤ 10001 ≤ 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.

Subscribe to see which companies asked this question.

將給定的序列分成m個子序列,使得各個序列的總和的最大值最小,求出這個最小的最大值。看了discuss才知道怎樣用二分法做,答案一定是在Max(序列的最大值)和sum(序列總和)之間,在這個范圍內進行二分搜索。對于當前的值d,如果序列能分成m個和小于等于d的序列,則表示當前值是“有效的”,可以進一步減少來尋找最終答案;如果不能,即分成多于m個和小于等于d的序列,則當前值比答案小,增大之尋找最終答案。最后縮到一個值,判斷這個值是否“有效”,“有效”的話答案是這個值,否則是這個值加1.

代碼:

class Solution {public:	int splitArray(vector<int>& nums, int m) 	{		int sum = 0, Max = 0;		for(auto num:nums)		{			sum += num;			Max = max(Max, num);		}		int l = Max, r = sum;		while(l < r)		{			int mid = l + (r - l) / 2;			bool b = isvalid(nums, m, mid);			if(b)			{				r = mid - 1;			}			else			{				l = mid + 1;			}		}		return isvalid(nums, m, l) ? l : l+1;	}PRivate:	bool isvalid(vector<int>& nums, int m, int d)	{		int sum = 0;		for(auto num:nums)		{			if(sum + num > d)			{				--m;				sum = 0;			}			if(m == 0) return false;			sum += num;		}		return true;	}};


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 萨嘎县| 建水县| 石阡县| 玉环县| 綦江县| 法库县| 宜川县| 寻甸| 益阳市| 邯郸县| 大洼县| 依安县| 达拉特旗| 白河县| 莱州市| 双辽市| 揭西县| 怀远县| 玉田县| 邵东县| 怀柔区| 甘泉县| 汽车| 吴桥县| 石门县| 济阳县| 北碚区| 子洲县| 垦利县| 喀喇沁旗| 龙门县| 周至县| 贡嘎县| 大理市| 武鸣县| 吕梁市| 社会| 海伦市| 广东省| 宁陕县| 剑阁县|