编写一个函数,将一个由整数(按非递减顺序排序)和一个整数A
组成的非空数组作为参数,检查 A 是否至少包含一次数字(从到的每个数字),并且不包含其他数字。例如,使用以下值:N
K
1,2, ..., K
1
K
int[] A = {1,1,2,3,3};
int K = 3;
该函数应该返回true
。如果你问
int[] A = {1, 1, 3};
int K = 2;
或者
int[] A = {1, 1, 2, 3};
int K = 2;
该函数应该返回false
。
我尝试编写以下函数,但无法正常工作
public boolean function(int[] A, int K){
int n = A.length;
for (int i = 0; i < n-1; i++){
if (A[i+1] >= A[i]+1)
return true;
if (A[0] != 1 && A[i] != K)
return false;
else
return true;
}
return true;
}
有什么问题?如果有人在代码中发现错误,非常感谢大家。
PS:我忘了补充一点,复杂性应该不会差O(n)
。
由于数组已排序,因此执行以下操作就足够了:
1) 检查第一个元素是否等于 1
2) 检查最后一个元素是否等于 K
3) 从第二个元素循环到最后一个元素,检查与前一个元素的差不超过 1
因此,您的解决方案实际上是正确的,唯一的错误是循环内的条件,并且在出现乱序的情况下返回 true 而不是 false。
这是提出的解决方案:
渐近复杂度
O(n*log(n))
肯定会更快更新
适用的解决方案
O(N)
编写一个 f-th,它将生成一个从 1 到 K(它是最大值)的数组。
,然后在正文中,它将检查数组的第 i 个元素是否包含在给定数组 A. 中,如果它不包含至少一次 - 错误,如果一切正常 - 正确。
实际上,您的问题是集合比较问题: