leetcode - 分割陣列的最大值
阿新 • • 發佈:2020-07-25
題目描述
給定一個非負整數陣列和一個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計一個演算法使得這 m 個子陣列各自和的最大值最小。
注意:
陣列長度 n 滿足以下條件:
1 ≤ n ≤ 1000
1 ≤ m ≤ min(50, n)
示例
輸入:
nums = [7,2,5,10,8]
m = 2
輸出:
18
解釋:
一共有四種方法將nums分割為2個子陣列。
其中最好的方式是將其分為[7,2,5] 和 [10,8],
因為此時這兩個子陣列各自的和的最大值為18,在所有情況中最小。
題解
第一點,被分成的m個子陣列的最大值必在nums的最大值和nums的元素之和之中。第二點,弱弱地猜猜看,拿所在區間範圍的中間值去套,看看其能夠得到多少個子區間數,如果說所得到的子區間數偏大於m,說明你劃分的太小了,令左區間等於中間值加1,反之相反。
/** * @param {number[]} nums * @param {number} m * @return {number} */ var splitArray = function(nums, m) { var left = Math.max(...nums); var right = nums.reduce((pre, cur) => pre + cur); if (nums.length === m) { return left; } if (m === 1) { return right; } while(left < right) { var mid = (left + right) >> 1; var cnt = 1; var sum = 0; for (const val of nums) { if (sum + val > mid) { sum = 0; cnt++; } sum += val; } if (cnt > m) { left = mid + 1; } else { right = mid; } } return left; };
程式碼地址: https://zhengjiangtao.cn/coding/interview/split_array.js
專案地址: https://zhengjiangtao.cn/coding/interview/split_array.js
參考文獻
- 分割陣列的最大值(leetcode) :https://leetcode-cn.com/problems/split-array-largest-sum
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。