public static int countUnreachable(int[] a) { int n = a.length; boolean[] dp = new boolean[1000001]; dp[0] = true; for (int i = 0; i < n; i++) { int x = a[i]; for (int j = 1000000; j >= x; j--) { dp[j] |= dp[j-x]; } } int ans = 0; for (int i = 1; i <= 1000000; i++) { if (!dp[i]) ans++; } return ans; }错在哪
时间: 2024-02-15 21:28:38 浏览: 156
src03 Boolean
这段代码看起来没有问题,但是有些细节需要注意,不然可能会超时或者出现数组越界的问题:
1. 在遍历蒸笼时,应该按照蒸笼大小从小到大遍历,否则可能会出现重复计算的情况。
2. 在遍历dp数组时,应该从1开始遍历,因为题目要求凑不出0个包子的情况视为可以凑出,所以不需要计入答案。
3. 数组dp的长度应该根据题目要求来确定,而不是固定为1000001,否则可能会出现数组越界的问题。
4. 在计算ans时,应该从1到dp.length-1遍历,否则可能会出现数组越界的问题。
下面是修正后的代码:
```
public static int countUnreachable(int[] a) {
int n = a.length;
boolean[] dp = new boolean[1000001];
dp[0] = true;
for (int i = 0; i < n; i++) {
int x = a[i];
for (int j = x; j < dp.length; j++) {
dp[j] |= dp[j-x];
}
}
int ans = 0;
for (int i = 1; i < dp.length; i++) {
if (!dp[i]) ans++;
}
return ans;
}
```
这个函数的时间复杂度为O(MN),其中M为数组dp的长度,N为蒸笼的数量。
阅读全文