LeetCode 410——分割數組的最大值

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」!
數組

相關文章
相關標籤/搜索