|
1 | 1 | package g0801_0900.s0805_split_array_with_same_average; |
2 | 2 |
|
3 | 3 | // #Hard #Array #Dynamic_Programming #Math #Bit_Manipulation #Bitmask |
4 | | -// #2022_03_23_Time_1323_ms_(22.41%)_Space_42.1_MB_(78.14%) |
| 4 | +// #2022_08_19_Time_1_ms_(100.00%)_Space_41.6_MB_(95.76%) |
5 | 5 |
|
6 | 6 | import java.util.Arrays; |
7 | 7 |
|
8 | 8 | public class Solution { |
| 9 | + private int[] nums; |
| 10 | + private int[] sums; |
| 11 | + |
9 | 12 | public boolean splitArraySameAverage(int[] nums) { |
10 | | - int m = nums.length; |
11 | | - int sum = 0; |
12 | | - for (int n : nums) { |
13 | | - sum += n; |
| 13 | + int len = nums.length; |
| 14 | + if (len == 1) { |
| 15 | + return false; |
14 | 16 | } |
15 | 17 | Arrays.sort(nums); |
16 | | - for (int len = 1; len <= m / 2; len++) { |
17 | | - if (sum * len % m == 0 && dfs(nums, sum * len / m, len, 0)) { |
| 18 | + sums = new int[len + 1]; |
| 19 | + for (int i = 0; i < len; i++) { |
| 20 | + sums[i + 1] = sums[i] + nums[i]; |
| 21 | + } |
| 22 | + int sum = sums[len]; |
| 23 | + this.nums = nums; |
| 24 | + for (int i = 1, stop = len / 2; i <= stop; i++) { |
| 25 | + if ((sum * i) % len == 0 && findSum(i, len, (sum * i) / len)) { |
18 | 26 | return true; |
19 | 27 | } |
20 | 28 | } |
21 | 29 | return false; |
22 | 30 | } |
23 | 31 |
|
24 | | - private boolean dfs(int[] nums, int sum, int len, int idx) { |
25 | | - if (len == 0) { |
26 | | - return sum == 0; |
27 | | - } |
28 | | - if (sum < 0 || idx >= nums.length) { |
29 | | - return false; |
30 | | - } |
31 | | - if (nums[idx] > sum / len) { |
32 | | - return false; |
| 32 | + private boolean findSum(int k, int pos, int target) { |
| 33 | + if (k == 1) { |
| 34 | + while (nums[--pos] > target) {} |
| 35 | + return nums[pos] == target; |
33 | 36 | } |
34 | | - for (int i = idx; i < nums.length; i++) { |
35 | | - if (i > idx && nums[i] == nums[i - 1]) { |
36 | | - continue; |
37 | | - } |
38 | | - if (dfs(nums, sum - nums[i], len - 1, i + 1)) { |
| 37 | + for (int i = pos; sums[i] - sums[i-- - k] >= target; ) { |
| 38 | + if (sums[k - 1] <= target - nums[i] && findSum(k - 1, i, target - nums[i])) { |
39 | 39 | return true; |
40 | 40 | } |
41 | 41 | } |
|
0 commit comments