rustgym/leetcode/
_410_split_array_largest_sum.rs1struct Solution;
2
3impl Solution {
4 fn split_array(nums: Vec<i32>, m: i32) -> i32 {
5 let mut lo = *nums.iter().max().unwrap();
6 let mut hi = nums.iter().sum();
7 let n = nums.len();
8 while lo <= hi {
9 let mid = (lo + hi) / 2;
10 if Self::split(&nums, mid, n) <= m {
11 hi = mid - 1;
12 } else {
13 lo = mid + 1;
14 }
15 }
16 lo
17 }
18
19 fn split(nums: &[i32], max: i32, n: usize) -> i32 {
20 let mut sum = 0;
21 let mut res = 1;
22 for i in 0..n {
23 if nums[i] + sum > max {
24 sum = nums[i];
25 res += 1;
26 } else {
27 sum += nums[i];
28 }
29 }
30 res
31 }
32}
33
34#[test]
35fn test() {
36 let nums = vec![7, 2, 5, 10, 8];
37 let m = 2;
38 let res = 18;
39 assert_eq!(Solution::split_array(nums, m), res);
40 let nums = vec![1, 2, 3, 4, 5];
41 let m = 2;
42 let res = 9;
43 assert_eq!(Solution::split_array(nums, m), res);
44 let nums = vec![1, 4, 4];
45 let m = 3;
46 let res = 4;
47 assert_eq!(Solution::split_array(nums, m), res);
48 let nums = vec![2, 3, 1, 2, 4, 3];
49 let m = 5;
50 let res = 4;
51 assert_eq!(Solution::split_array(nums, m), res);
52}