1. 題目

2. 解答
此題目為 今日頭條 2018 AI Camp 5 月 26 日在線筆試編程題第二道——最小分割分數。
class Solution {
public:
// 若分割數組的最大值為 value,判斷能否進行划分
bool cansplit(vector<int>& nums, int value, int m)
{
int len = nums.size();
int i = 0;
int sum = 0;
int split_count = 0; // 分割次數
// 依次往后求和,若和小於等於 value,則繼續加;
// 若和大於 value,則分割次數加 1,從當前位置開始將和清零,重新開始
for (i = 0; i < len; i++)
{
if (sum + nums[i] <= value)
{
sum += nums[i];
}
else
{
split_count++;
sum = nums[i];
}
if (split_count == m) // 分割次數超出 m, 不滿足划分
{
return false;
}
}
return true;
}
int splitArray(vector<int>& nums, int m) {
int len = nums.size();
int i = 0;
// 分割數組的最大值介於數組的最大元素和數組所有元素的和之間
int max = nums[0];
int sum = 0;
for (i = 0; i < len; i++)
{
if (nums[i] > max)
{
max = nums[i];
}
sum += nums[i];
}
int left = max;
int right = sum;
int mid = 0;
while(left < right)
{
mid = left + (right - left) / 2;
if (cansplit(nums, mid, m)) // 能划分,繼續找有沒有更小的值
{
right = mid; //不減是因為無法確保減一之后的數是否滿足划分
}
else // 不能划分,增大數值繼續尋找
{
left = mid + 1;
}
}
return left;
// 最終 left = right 結束,left 值就是所求
}
};
獲取更多精彩,請關注「seniusen」!

