|
2 | 2 |
|
3 | 3 | public class MaximumSubarraySum {
|
4 | 4 |
|
5 |
| - // brute force approch - O(N^2) Time | O(1) Space |
| 5 | + // brute force approch - O(N*k) Time | O(1) Space |
6 | 6 | public static int maxSubarraySum(int[] arr, int k) {
|
7 | 7 |
|
8 | 8 | int maxsum = Integer.MIN_VALUE;
|
9 | 9 |
|
10 | 10 | for (int i = 0; i <= arr.length - k; i++) {
|
11 |
| - int currsum = 0; |
| 11 | + int windowsum = 0; |
12 | 12 |
|
13 | 13 | for (int window = 0; window < k; window++) {
|
14 |
| - currsum += arr[i + window]; |
| 14 | + windowsum += arr[i + window]; |
15 | 15 | }
|
16 |
| - maxsum = Math.max(maxsum, currsum); |
| 16 | + maxsum = Math.max(maxsum, windowsum); |
| 17 | + } |
| 18 | + |
| 19 | + return maxsum; |
| 20 | + } |
| 21 | + |
| 22 | + // O(N) Time | O(1) Space |
| 23 | + public static int maxSubarraySum2(int[] arr, int k) { |
| 24 | + |
| 25 | + int maxsum = Integer.MIN_VALUE; |
| 26 | + int head = 0, tail = k, n = arr.length; |
| 27 | + |
| 28 | + int windowSum = 0; |
| 29 | + for (int i = 0; i < k; i++) { |
| 30 | + windowSum += arr[i]; |
| 31 | + } |
| 32 | + maxsum = Math.max(maxsum, windowSum); |
| 33 | + |
| 34 | + for (int slide = 1; slide <= n - k; slide++) { |
| 35 | + |
| 36 | + if (head < n && tail < n) { |
| 37 | + windowSum -= arr[head]; |
| 38 | + windowSum += arr[tail]; |
| 39 | + head++; |
| 40 | + tail++; |
| 41 | + } |
| 42 | + maxsum = Math.max(maxsum, windowSum); |
17 | 43 | }
|
18 | 44 |
|
19 | 45 | return maxsum;
|
20 | 46 | }
|
21 | 47 |
|
22 | 48 | public static void main(String[] args) {
|
23 | 49 | int[] arr = { 1, 4, 2, 10, 23, 3, 1, 0, 20 };
|
| 50 | + // int[] arr = { 100, 200, 300, 400 }; |
24 | 51 | int windowSize = 4;
|
| 52 | + |
25 | 53 | System.out.println(maxSubarraySum(arr, windowSize));
|
| 54 | + System.out.println(maxSubarraySum2(arr, windowSize)); |
26 | 55 | }
|
27 | 56 | }
|
0 commit comments