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.
124 lines
2.9 KiB
124 lines
2.9 KiB
2 years ago
|
package class16;
|
||
|
|
||
|
import java.util.Arrays;
|
||
|
import java.util.HashSet;
|
||
|
|
||
|
public class Code02_SmallestUnFormedSum {
|
||
|
|
||
|
public static int unformedSum1(int[] arr) {
|
||
|
if (arr == null || arr.length == 0) {
|
||
|
return 1;
|
||
|
}
|
||
|
HashSet<Integer> set = new HashSet<Integer>();
|
||
|
process(arr, 0, 0, set);
|
||
|
int min = Integer.MAX_VALUE;
|
||
|
for (int i = 0; i != arr.length; i++) {
|
||
|
min = Math.min(min, arr[i]);
|
||
|
}
|
||
|
for (int i = min + 1; i != Integer.MIN_VALUE; i++) {
|
||
|
if (!set.contains(i)) {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
public static void process(int[] arr, int i, int sum, HashSet<Integer> set) {
|
||
|
if (i == arr.length) {
|
||
|
set.add(sum);
|
||
|
return;
|
||
|
}
|
||
|
process(arr, i + 1, sum, set);
|
||
|
process(arr, i + 1, sum + arr[i], set);
|
||
|
}
|
||
|
|
||
|
public static int unformedSum2(int[] arr) {
|
||
|
if (arr == null || arr.length == 0) {
|
||
|
return 1;
|
||
|
}
|
||
|
int sum = 0;
|
||
|
int min = Integer.MAX_VALUE;
|
||
|
for (int i = 0; i != arr.length; i++) {
|
||
|
sum += arr[i];
|
||
|
min = Math.min(min, arr[i]);
|
||
|
}
|
||
|
// boolean[][] dp ...
|
||
|
int N = arr.length;
|
||
|
boolean[][] dp = new boolean[N][sum + 1];
|
||
|
for (int i = 0; i < N; i++) {// arr[0..i] 0
|
||
|
dp[i][0] = true;
|
||
|
}
|
||
|
dp[0][arr[0]] = true;
|
||
|
for (int i = 1; i < N; i++) {
|
||
|
for (int j = 1; j <= sum; j++) {
|
||
|
dp[i][j] = dp[i - 1][j] || ((j - arr[i] >= 0) ? dp[i - 1][j - arr[i]] : false);
|
||
|
}
|
||
|
}
|
||
|
for (int j = min; j <= sum; j++) {
|
||
|
if (!dp[N - 1][j]) {
|
||
|
return j;
|
||
|
}
|
||
|
}
|
||
|
return sum + 1;
|
||
|
}
|
||
|
|
||
|
// 已知arr中肯定有1这个数
|
||
|
public static int unformedSum3(int[] arr) {
|
||
|
if (arr == null || arr.length == 0) {
|
||
|
return 0;
|
||
|
}
|
||
|
Arrays.sort(arr); // O (N * logN)
|
||
|
int range = 1;
|
||
|
// arr[0] == 1
|
||
|
for (int i = 1; i != arr.length; i++) {
|
||
|
if (arr[i] > range + 1) {
|
||
|
return range + 1;
|
||
|
} else {
|
||
|
range += arr[i];
|
||
|
}
|
||
|
}
|
||
|
return range + 1;
|
||
|
}
|
||
|
|
||
|
public static int[] generateArray(int len, int maxValue) {
|
||
|
int[] res = new int[len];
|
||
|
for (int i = 0; i != res.length; i++) {
|
||
|
res[i] = (int) (Math.random() * maxValue) + 1;
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
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 = 27;
|
||
|
int max = 30;
|
||
|
int[] arr = generateArray(len, max);
|
||
|
printArray(arr);
|
||
|
long start = System.currentTimeMillis();
|
||
|
System.out.println(unformedSum1(arr));
|
||
|
long end = System.currentTimeMillis();
|
||
|
System.out.println("cost time: " + (end - start) + " ms");
|
||
|
System.out.println("======================================");
|
||
|
|
||
|
start = System.currentTimeMillis();
|
||
|
System.out.println(unformedSum2(arr));
|
||
|
end = System.currentTimeMillis();
|
||
|
System.out.println("cost time: " + (end - start) + " ms");
|
||
|
System.out.println("======================================");
|
||
|
|
||
|
System.out.println("set arr[0] to 1");
|
||
|
arr[0] = 1;
|
||
|
start = System.currentTimeMillis();
|
||
|
System.out.println(unformedSum3(arr));
|
||
|
end = System.currentTimeMillis();
|
||
|
System.out.println("cost time: " + (end - start) + " ms");
|
||
|
|
||
|
}
|
||
|
}
|