You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
1.9 KiB
92 lines
1.9 KiB
2 years ago
|
package class40;
|
||
|
|
||
|
public class Code01_LongestSumSubArrayLengthInPositiveArray {
|
||
|
|
||
|
public static int getMaxLength(int[] arr, int K) {
|
||
|
if (arr == null || arr.length == 0 || K <= 0) {
|
||
|
return 0;
|
||
|
}
|
||
|
int left = 0;
|
||
|
int right = 0;
|
||
|
int sum = arr[0];
|
||
|
int len = 0;
|
||
|
while (right < arr.length) {
|
||
|
if (sum == K) {
|
||
|
len = Math.max(len, right - left + 1);
|
||
|
sum -= arr[left++];
|
||
|
} else if (sum < K) {
|
||
|
right++;
|
||
|
if (right == arr.length) {
|
||
|
break;
|
||
|
}
|
||
|
sum += arr[right];
|
||
|
} else {
|
||
|
sum -= arr[left++];
|
||
|
}
|
||
|
}
|
||
|
return len;
|
||
|
}
|
||
|
|
||
|
// for test
|
||
|
public static int right(int[] arr, int K) {
|
||
|
int max = 0;
|
||
|
for (int i = 0; i < arr.length; i++) {
|
||
|
for (int j = i; j < arr.length; j++) {
|
||
|
if (valid(arr, i, j, K)) {
|
||
|
max = Math.max(max, j - i + 1);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return max;
|
||
|
}
|
||
|
|
||
|
// for test
|
||
|
public static boolean valid(int[] arr, int L, int R, int K) {
|
||
|
int sum = 0;
|
||
|
for (int i = L; i <= R; i++) {
|
||
|
sum += arr[i];
|
||
|
}
|
||
|
return sum == K;
|
||
|
}
|
||
|
|
||
|
// for test
|
||
|
public static int[] generatePositiveArray(int size, int value) {
|
||
|
int[] ans = new int[size];
|
||
|
for (int i = 0; i != size; i++) {
|
||
|
ans[i] = (int) (Math.random() * value) + 1;
|
||
|
}
|
||
|
return ans;
|
||
|
}
|
||
|
|
||
|
// for test
|
||
|
public static void printArray(int[] arr) {
|
||
|
for (int i = 0; i != arr.length; i++) {
|
||
|
System.out.print(arr[i] + " ");
|
||
|
}
|
||
|
System.out.println();
|
||
|
}
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
int len = 50;
|
||
|
int value = 100;
|
||
|
int testTime = 500000;
|
||
|
System.out.println("test begin");
|
||
|
for (int i = 0; i < testTime; i++) {
|
||
|
int[] arr = generatePositiveArray(len, value);
|
||
|
int K = (int) (Math.random() * value) + 1;
|
||
|
int ans1 = getMaxLength(arr, K);
|
||
|
int ans2 = right(arr, K);
|
||
|
if (ans1 != ans2) {
|
||
|
System.out.println("Oops!");
|
||
|
printArray(arr);
|
||
|
System.out.println("K : " + K);
|
||
|
System.out.println(ans1);
|
||
|
System.out.println(ans2);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
System.out.println("test end");
|
||
|
}
|
||
|
|
||
|
}
|