LeetCode 题解 | 410. 分割数组的最大值(最大值最小化 二分答案 C++)
程序员文章站
2022-03-16 11:23:33
...
题目描述(困难难度)
算法
(二分答案)
二分答案经典题
所求的最大子数组和在 [max(nums), sum(nums)] 之内,但是我其实稍微扩大范围也能做,但要注意check函数里要多一句判断语句if (nums[i] > x) return false;
C++代码1
class Solution {
public:
// 最大值的最小化问题
typedef long long LL;
bool check(vector<int> & nums, long long x, int m) {
LL sum = 0;
m --;
for (int i = 0; i < nums.size(); i ++) {
sum += nums[i];
if (sum > x) {
sum = nums[i];
// 因为我边界取的是无穷,所以如果单独一天都比x大了,那x一定不是最大值
if (nums[i] > x) return false;
m --;
}
}
return m >= 0;
}
int splitArray(vector<int>& nums, int m) {
LL l = -1e9, r = 1e12;
while (l < r) {
LL mid = l + r >> 1;
if (check(nums, mid, m)) r = mid;
else l = mid + 1;
}
return r;
}
};
C++代码2
这段代码,我求出来了左边界max(nums[i]),目的是保证x >= nums[i]
class Solution {
public:
// 最大值的最小化问题
typedef long long LL;
bool check(vector<int> & nums, long long x, int m) {
LL sum = 0;
m --;
for (int i = 0; i < nums.size(); i ++) {
sum += nums[i];
if (sum > x) {
sum = nums[i];
// 因为我边界取的是无穷,所以如果单独一天都比x大了,那x一定不是最大值
// if (nums[i] > x) return false;
m --;
}
}
return m >= 0;
}
int splitArray(vector<int>& nums, int m) {
LL l = *max_element(nums.begin(),nums.end()), r = 1e12;
while (l < r) {
LL mid = l + r >> 1;
if (check(nums, mid, m)) r = mid;
else l = mid + 1;
}
return r;
}
};
上一篇: 笨办法学python 习题4:变量(variable)和命名
下一篇: 远程连接mysql数据库方法