|
29 | 29 | */
|
30 | 30 | public class _410 {
|
31 | 31 |
|
32 | | - /**credit: https://discuss.leetcode.com/topic/61324/clear-explanation-8ms-binary-search-java |
33 | | - * |
34 | | - * The answer is between maximum value of input array numbers and sum of those numbers. |
35 | | - Use binary search to approach the correct answer. |
36 | | - We have l = max number of array; |
37 | | - r = sum of all numbers in the array; |
38 | | - Every time we do mid = (l + r) / 2; |
| 32 | + public static class Solution1 { |
| 33 | + /** |
| 34 | + * credit: https://discuss.leetcode.com/topic/61324/clear-explanation-8ms-binary-search-java |
| 35 | + * |
| 36 | + * The answer is between maximum value of input array numbers and sum of those numbers. Use |
| 37 | + * binary search to approach the correct answer. We have l = max number of array; r = sum of all |
| 38 | + * numbers in the array; Every time we do mid = (l + r) / 2; |
| 39 | + * |
| 40 | + * Use greedy to narrow down left and right boundaries in binary search. 3.1 Cut the array from |
| 41 | + * left. 3.2 Try our best to make sure that the sum of numbers between each two cuts (inclusive) |
| 42 | + * is large enough but still less than mid. 3.3 We'll end up with two results: either we can |
| 43 | + * divide the array into more than m subarrays or we cannot. If we can, it means that the mid |
| 44 | + * value we pick is too small because we've already tried our best to make sure each part holds |
| 45 | + * as many non-negative numbers as we can but we still have numbers left. So, it is impossible |
| 46 | + * to cut the array into m parts and make sure each parts is no larger than mid. We should |
| 47 | + * increase m. This leads to l = mid + 1; If we can't, it is either we successfully divide the |
| 48 | + * array into m parts and the sum of each part is less than mid, or we used up all numbers |
| 49 | + * before we reach m. Both of them mean that we should lower mid because we need to find the |
| 50 | + * minimum one. This leads to r = mid - 1; |
| 51 | + */ |
39 | 52 |
|
40 | | - Use greedy to narrow down left and right boundaries in binary search. |
41 | | - 3.1 Cut the array from left. |
42 | | - 3.2 Try our best to make sure that the sum of numbers between each two cuts (inclusive) is large enough but still less than mid. |
43 | | - 3.3 We'll end up with two results: either we can divide the array into more than m subarrays or we cannot. |
44 | | - If we can, it means that the mid value we pick is too small because we've already |
45 | | - tried our best to make sure each part holds as many non-negative numbers as we can |
46 | | - but we still have numbers left. |
47 | | - So, it is impossible to cut the array into m parts and make sure each parts is no larger than mid. |
48 | | - We should increase m. This leads to l = mid + 1; |
49 | | - If we can't, it is either we successfully divide the array into m parts and |
50 | | - the sum of each part is less than mid, |
51 | | - or we used up all numbers before we reach m. |
52 | | - Both of them mean that we should lower mid because we need to find the minimum one. This leads to r = mid - 1;*/ |
53 | | - |
54 | | - public int splitArray(int[] nums, int m) { |
55 | | - int max = 0; |
56 | | - long sum = 0; |
57 | | - for (int num : nums) { |
58 | | - max = Math.max(num, max); |
59 | | - sum += num; |
60 | | - } |
61 | | - if (m == 1) { |
62 | | - return (int) sum; |
63 | | - } |
64 | | - //binary search |
65 | | - long l = max; |
66 | | - long r = sum; |
67 | | - while (l <= r) { |
68 | | - long mid = (l + r) / 2; |
69 | | - if (valid(mid, nums, m)) { |
70 | | - r = mid - 1; |
71 | | - } else { |
72 | | - l = mid + 1; |
| 53 | + public int splitArray(int[] nums, int m) { |
| 54 | + int max = 0; |
| 55 | + long sum = 0; |
| 56 | + for (int num : nums) { |
| 57 | + max = Math.max(num, max); |
| 58 | + sum += num; |
| 59 | + } |
| 60 | + if (m == 1) { |
| 61 | + return (int) sum; |
73 | 62 | }
|
| 63 | + //binary search |
| 64 | + long l = max; |
| 65 | + long r = sum; |
| 66 | + while (l <= r) { |
| 67 | + long mid = (l + r) / 2; |
| 68 | + if (valid(mid, nums, m)) { |
| 69 | + r = mid - 1; |
| 70 | + } else { |
| 71 | + l = mid + 1; |
| 72 | + } |
| 73 | + } |
| 74 | + return (int) l; |
74 | 75 | }
|
75 | | - return (int) l; |
76 | | - } |
77 | 76 |
|
78 | | - public boolean valid(long target, int[] nums, int m) { |
79 | | - int count = 1; |
80 | | - long total = 0; |
81 | | - for (int num : nums) { |
82 | | - total += num; |
83 | | - if (total > target) { |
84 | | - total = num; |
85 | | - count++; |
86 | | - if (count > m) { |
87 | | - return false; |
| 77 | + public boolean valid(long target, int[] nums, int m) { |
| 78 | + int count = 1; |
| 79 | + long total = 0; |
| 80 | + for (int num : nums) { |
| 81 | + total += num; |
| 82 | + if (total > target) { |
| 83 | + total = num; |
| 84 | + count++; |
| 85 | + if (count > m) { |
| 86 | + return false; |
| 87 | + } |
88 | 88 | }
|
89 | 89 | }
|
| 90 | + return true; |
90 | 91 | }
|
91 | | - return true; |
92 | 92 | }
|
93 | | - |
94 | 93 | }
|
0 commit comments