给定长度为n的数组A [],找到"缺少"数字k使得:
我已经看到类似的问题,其中A []包含数字1到n,其中一个数字丢失,但在这个问题中,A []可以包含任何数字。我需要O(n)时间的解决方案。例如,
A = {1,2,3} -> 0
A = {0,1,2} -> 3
A = {2,7,4,1,6,0,5,-3} -> 3,8
我已经检查了数组中是否有0或n,如果没有,则返回0或n,但我似乎无法想到任何其他解决方案。考虑到A可以包含任何数字而不一定是数字1到n或类似的事实,这个问题似乎要困难得多。
答案 0 :(得分:5)
线性迭代数组并“划掉”您遇到的每个数字。然后再次迭代所列出的划掉的数字,看看哪一个丢失了。
public static int getMissingNumber(int[] A)
{
int n = A.length;
boolean[] numbersUsed = new boolean[n + 1]; //Because the definition says 0 <= k <= n, so k = n is also possible.
for(int k = 0; k < n; k++)
{
if(A[k] <= n && A[k] >= 0) //No negative numbers!
numbersUsed[A[k]] = true;
}
for(int k = 0; k <= n; k++)
{
if(numbersUsed[k] == false)
return k;
}
return -1; //nothing found
}
由于两个for
循环,复杂性为2 * n,因此总体复杂度为O(n)
。
答案 1 :(得分:1)
简单方法:
答案 2 :(得分:0)
如果您知道缺少一个数字,则可以使用xor。
进行简单的解决方案static int missing(int[] arr) {
int result = 0;
for (int i = 0; i < arr.length; i++)
result ^= (i + 1) ^ arr[i];
return result;
}
如果可能缺少多个号码,您可以像这样返回Set
:
static Set<Integer> missing(int[] arr) {
Set<Integer> set = new HashSet<>();
for (int i = 0; i <= arr.length; i++)
set.add(i);
for (int a : arr)
set.remove(a);
return set;
}
答案 3 :(得分:0)
这里是一种利用一个循环的解决方案。那就是我们选择忽略Arrays.sort的作用
import java.util.Arrays;
class Solution {
public int solution(int[] A) {
Arrays.sort(A);
int min = 1;
for (int i = 0; i < A.length; i++){
if(A[i]== min){
min++;
}
}
min = ( min <= 0 ) ? 1:min;
return min;
}
}
答案 4 :(得分:0)
class Missing{
public static void main(String[] args) {
int i;int result;
int a[]={1,2,4,5,6,7,9};
for(i=0;i<a.length-1;i++){
if(a[i+1]-a[i]!=1){
result=a[i]+1;
System.out.print("missing element is:"+result);
}
}
}
}
//output:missing element is:3
// missing element is:8