410. 배열 최대 합계 분할

설명



음수가 아닌 정수와 정수nums로 구성된 배열m이 있으면 배열을 비어 있지 않은 연속 하위 배열m로 분할할 수 있습니다.

이러한 m 하위 배열 중에서 가장 큰 합을 최소화하는 알고리즘을 작성하세요.

예 1:




Input: nums = [7,2,5,10,8], m = 2
Output: 18
Explanation:
There are four ways to split nums into two subarrays.
The best way is to split it into [7,2,5] and [10,8],
where the largest sum among the two subarrays is only 18.


예 2:




Input: nums = [1,2,3,4,5], m = 2
Output: 9


예 3:




Input: nums = [1,4,4], m = 3
Output: 4


제약:


  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 106
  • 1 <= m <= min(50, nums.length)



  • 솔루션



    솔루션 1



    직관


  • 이진 검색
  • 욕심쟁이
  • mid는 분할 부분
  • 의 합largest을 의미합니다.
  • 배열을 여러 부분으로 분할하고 각 부분의 최대 합계는 중간/최대이며 필요한 부분 수를 확인합니다 — cnt , cntm인지 확인합니다.

  • 암호




    class Solution {
    public:
        bool check(vector<int>& nums, int m, int largest) {
            int sum = 0, cnt = 0;
            for (int x : nums) {
                if (x > largest) return false;
                if (sum + x > largest) {
                    sum = x;
                    cnt++;
                } else {
                    sum += x;
                }
            }
            if (sum >= 0) cnt++;
            return cnt <= m;
        }
        int splitArray(vector<int>& nums, int m) {
            int l = 0, r = INT_MAX, mid;
            while (l < r) {
                mid = l + r >> 1;
                if (check(nums, m, mid))
                    r = mid;
                else
                    l = mid + 1;
            }
            return l;
        }
    };
    


    복잡성


  • 시간: O(nlogs)
  • 공간: O(1)
  • 좋은 웹페이지 즐겨찾기