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.
93 lines
2.0 KiB
93 lines
2.0 KiB
package class40;
|
|
|
|
import java.util.HashMap;
|
|
|
|
public class Code02_LongestSumSubArrayLength {
|
|
|
|
public static int maxLength(int[] arr, int k) {
|
|
if (arr == null || arr.length == 0) {
|
|
return 0;
|
|
}
|
|
// key:前缀和
|
|
// value : 0~value这个前缀和是最早出现key这个值的
|
|
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
|
|
map.put(0, -1); // important
|
|
int len = 0;
|
|
int sum = 0;
|
|
for (int i = 0; i < arr.length; i++) {
|
|
sum += arr[i];
|
|
if (map.containsKey(sum - k)) {
|
|
len = Math.max(i - map.get(sum - k), len);
|
|
}
|
|
if (!map.containsKey(sum)) {
|
|
map.put(sum, i);
|
|
}
|
|
}
|
|
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[] generateRandomArray(int size, int value) {
|
|
int[] ans = new int[(int) (Math.random() * size) + 1];
|
|
for (int i = 0; i < ans.length; i++) {
|
|
ans[i] = (int) (Math.random() * value) - (int) (Math.random() * value);
|
|
}
|
|
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 = generateRandomArray(len, value);
|
|
int K = (int) (Math.random() * value) - (int) (Math.random() * value);
|
|
int ans1 = maxLength(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");
|
|
|
|
}
|
|
|
|
}
|