繁体   English   中英

在Java中嵌套for循环的数组中查找缺失的数字

[英]Finding the missing number in an array with nested for loops in Java

我需要在O(n ^ 2)时间中在数组中找到丢失的数字。 我可以重新排列数组,这样就可以了,但是我很难找到丢失的数字而又不运行另一个for循环,但是我做不到。 这是我的代码:此处缺少的数字为3。

public static void main(String[] args){
    int ar []={0,1,6,2,5,7,4};
    int n = ar.length;
    int temp = 0;
    int m = 0;
    for(int i = 0; i<n;i++){
        for(int j = 1; j<n;j++){
            if(ar[j-1] > ar[j]){
                temp = ar[j-1];
                ar[j-1]=ar[j];
                ar[j]=temp;

                if(ar[j-1]!=j-1) m=j;
            }
            else ar[j]=ar[j];
            if(ar[j-1]!=j-1) m=j;
        }
    }
    System.out.println(m);
}

如果输入数组包含0到ar.length之间的所有数字,但缺少一个缺失的数字(如您的{0,1,6,2,5,7,4}示例),则可以在线性时间内找到缺失的数字。

只需计算整个数组的所有数字的总和(包括缺失的数字在内)-该数组的ar.length + 1元素从0到ar.length ,因此其总和为(ar.length - 0)*(ar.length + 1)/2从中减去实际的总和(您可以在简单的线性时间循环中进行计算)。 差异将是缺少的数字。

如果存在多个缺失的数字(或者可能存在重复的数字),并且您需要找到第一个缺失的数字,则以O(n*log(n)时间对数组进行排序,然后在数组上进行单个(线性时间)传递排序数组仍将比O(n^2)解决方案更好。

如果您只能执行2个循环,并且必须对O(n ^ 2)执行2个循环,那么我建议如下:

  • 循环遍历所有值(外循环)。
  • 对于每个值,请循环遍历所有值(内部循环),然后找到比当前值高的最小值。
  • 如果找不到更高的值,请跳过(当前值为最高值)
  • 如果找到的最小值不是当前值+1,那么您发现缺少的值

这个怎么样?

int array[] = {0,1,6,2,5,7,4};
int arrayTemp[] = array;
ArrayList<Integer> missing = new ArrayList();
Arrays.sort(arrayTemp);

for (int i=1; i<arrayTemp.length; i++) {
    for (int j=arrayTemp[i-1]+1; j<arrayTemp[i]; j++) {
        missing.add(j);
    }
}
for (int i=arrayTemp[arrayTemp.length-1]+1; i<=arrayTemp[arrayTemp.length-1]; i++) {
    missing.add(i);
}

System.out.println(missing.toString());

输出:

{0,1,6,2,5,7,4}    -> [3]
{0,1,6,2,5,7,4,14} -> [3, 8, 9, 10, 11, 12, 13]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM