天天看點

數組有N-2個數字,數字的範圍為1 ... N,沒有重複的元素,要求列印缺少的2個數字, 空間複雜度O(1)。...

[size=large]數組有N-2個數字,數字的範圍為1 ... N,沒有重複的元素,要求列印缺少的2個數字, 空間複雜度O(1)。

這個題其實考察的是我們怎樣用最少的輔助空間求出數組中缺少的兩個數。其實可以通過數學思想解決這兩個問題。

首先缺少的兩個數假設是a和b,那如果我們能計算出a+b和a-b,自然就能計算出a和b的值,也就是數組中缺少的值。

那怎麼得到a+b呢?我們一隻N個中的N-2個那用N個和減去N-2個已知的數就可以了。

那怎麼計算兩個數的內插補點即a-b呢??

直接計算沒思路,其實我們可以按照上面的思路,先計算出1……N的平方和,然後減去已知的N-2個數的平放,就得到了a*a+b*b了。

然後就可以得到a-b的平方再開放就ok了。[/size]

[color=red][size=x-large]兩個公式如下:

等差數列求和:sum=N(N+1)/2

連續自然數的平方和公式:N(N+1)(2N+1)/6[/size][/color]

看看具體實作代碼吧O(∩_∩)O哈哈~

private static void find()
    {
        int[] A = new int[] { 1, 3, 4, 8, 7, 5, 6,  10, 11, 12 };
        int n = A.length + 2;
        int sum = (n * (n + 1)) >> 1;
        int squareSum = sum * (2 * n + 1) / 3;

        for (int i = 0; i < A.length; i++)
        {
            sum -= A[i];
            squareSum -= A[i] * A[i];
        }

        int ASubB=(int) Math.sqrt(-(sum*sum)+2*squareSum);


        System.out.println(((sum + ASumB) >> 1)+ " and "+ ((sum - ASumB) >> 1));
    }
           

上述代碼由Java語言實作

[size=large]camel駱駝男士涼鞋 真皮潮流魔術貼沙灘鞋男鞋 夏季新款正品涼鞋 隻要56元![/size]

[img]http://dl2.iteye.com/upload/attachment/0100/0992/48f19884-1441-3164-b472-bc04a9e7dd39.jpg[/img]

[url]http://redirect.simba.taobao.com/rd?w=unionnojs&f=http%3A%2F%2Fai.taobao.com%2Fauction%2Fedetail.htm%3Fe%3DYNbrUj%252FZdJwjmraEDZVrLkKA%252ByOYgzU6TbuPAry6zvGLltG5xFicOdXrTUTgh9sMDPIwxrc30rhF03SVjj78hGqYCHH8uv2oZb7Xhy%252F%252BGHmWC8e6JwspUeIZWR1bMnHu%26unid%3D96391090%26ptype%3D100010%26from%3Dbasic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_96391090_7268811_24064425[/url]

[img]http://dl2.iteye.com/upload/attachment/0099/9409/b98128e6-a6e6-3377-8d00-68328a1c7e7f.jpg[/img]

[url]http://redirect.simba.taobao.com/rd?w=unionnojs&f=http%3A%2F%2Fai.taobao.com%2Fauction%2Fedetail.htm%3Fe%3DsmP1GufbVc4jmraEDZVrLqyWM2UFoMuM7AU7Qokl6rSLltG5xFicOdXrTUTgh9sMDPIwxrc30rhF03SVjj78hGqYCHH8uv2oZb7Xhy%252F%252BGHmWC8e6JwspUeIZWR1bMnHu%26unid%3D96391090%26ptype%3D100010%26from%3Dbasic&k=5ccfdb950740ca16&c=un&b=alimm_0&p=mm_96391090_7268811_24064425[/url]