此題目爲 今日頭條 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」! 數組