Java 在数组中搜索缺失数字时的性能

Java 在数组中搜索缺失数字时的性能,java,performance,algorithm,search,arraylist,Java,Performance,Algorithm,Search,Arraylist,给出了一个列表,其中包含除2个数字以外的所有1-20之间的数字(随机排序)。 我需要找到那两个号码 这是我提出的(工作)计划: public static void main(String[] args) { int[] x= {1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; ArrayList al= new ArrayList(); Map map= new HashMap(); for(int i=0;i<

给出了一个列表,其中包含除2个数字以外的所有1-20之间的数字(随机排序)。 我需要找到那两个号码

这是我提出的(工作)计划:

public static void main(String[] args) {
    int[] x= {1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
    ArrayList al= new ArrayList();
    Map map= new HashMap();
    for(int i=0;i<x.length;i++)
    {
        map.put(x[i], x[i]);
    }
    for(int i=1;i<=20;i++)
    {
        if(map.get(i)==null)
            al.add(i);
    }
    for(int i=0;i<al.size();i++)
    {
        System.out.println(al.get(i));
    }
}
publicstaticvoidmain(字符串[]args){
int[]x={1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
ArrayList al=新的ArrayList();
Map Map=newhashmap();

对于(inti=0;i您不需要映射。只需要一个大小为20的附加布尔数组

for (int i = 0; i < input.length; i++)
   arr[input[i]] = true;

for (int i = 1; i <= 20; i++)
   if (arr[i] == false) {
      //number `i` is missing
   }     
所以我们知道
x+y=15-10=5
现在我们将得到第二个等式:

1 * 4 * 5 = 20
1 * 2 * 3 * 4 * 5 = 120
=> x * y = 120 / 20 = 6
因此:

=>
x=2,y=3或x=3,y=2
两者相同

因此
x=2,y=3

由于map.put操作,您的代码在O(n)处运行。下面的for循环在最坏的情况下也将在O(n)处运行,因此总体而言,您的整个函数在O(n)处运行

你可以进一步优化你的代码。例如,你正在使用额外的内存。为了改进这一点,你需要拿出两个等式来推断缺失的数字x和y

方程1: 总和(1到20)=n*(n+1)/2 将数组中的所有数字相加并存储在temp中。 x+y=n*(n+1)/2-温度

等式n2: 乘(1到20)=n! 将数组中的所有数字相乘并存储在temp中。 x*y=温度/n

解方程得到x和y


因此,这将在没有太多内存的情况下运行O(n)。

它不应该比线性时间O(n)更糟糕:一次运行填充标志数组,第二次运行检查标志数组。

另一个选项是使用位集,其中每个位都为数组中的相应数字设置。

布尔数组更容易理解(并节省空间)。@Stephen C-Yep,我写它更像是一个伪代码。我将进行编辑以使其更清晰。我喜欢使用数学的想法,但我想如果列表增加,您很快就会需要一个长的,不久之后就需要一个大整数的产品了。@user unknown-是的,非常正确:)
1 * 4 * 5 = 20
1 * 2 * 3 * 4 * 5 = 120
=> x * y = 120 / 20 = 6
x + y = 5
x * y = 6