二分查找 + 贪心
解题思路
可以用于查找一个 有范围的 整数,就能想到是不是可以使用二分查找去解决这道问题;
这道题是对结果的二分,同 leetcode🧑💻 410. 分割数组的最大值 题解一致,只是换了种方式表达;
复杂度
-
时间复杂度:
O(nlog(sum − maxn))
,其中 sum 表示数组 weights 中所有元素的和,maxn 表示数组所有元素的最大值;每次二分查找时,需要对数组进行一次遍历,时间复杂度为O(n)
-
空间复杂度:
O(1)
代码实现
var shipWithinDays = function (weights, days) {
let left = Math.max(...weights);
let right = weights.reduce((sum, curr) => sum += curr, 0);
while (left < right) {
let mid = left + Math.floor((right - left) / 2);
let cnt = check(weights, mid);
if (cnt > days) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
};
function check(weights, maxIntervalSum) {
let cnt = 1;
let sum = 0;
for (const w of weights) {
if (sum + w > maxIntervalSum) {
cnt++;
sum = 0;
}
sum += w;
}
return cnt;
}
动态规划
解题思路
复杂度
代码实现
// 先欠着
leetcode🧑💻 410. 分割数组的最大值
上一篇