JAVA劍指offer題目03 數組中重複的數字我的解題思路

題目鏈接
前陣子在leetCode上做了一道劍指offer的“題目,是這樣的
在這裏插入圖片描述
題目很簡單, 非常直觀的解法就是:
排序
然後就搞定了,但是這樣的時間複雜度是O(nlogn)。
沒事,那就出大招,空間換時間:不管三七二十一我就是哈希 ,然後遍歷就完事。時間和空間複雜度都是O(n)。但是我覺得,這樣好像不夠溫和儒雅,這空間複雜度完全可以優化呀。下面給大家看看我的解法。

我們可以構建這個一個特殊的哈希表,下標0到n-1依次對應數值0到n-1有沒有出現過,如果數字x第一次出現,那麼下標x 的位置的元素應該爲該位置的相反值,標識這個數字x出現過,當我們下一次再遇到x,判斷一下下標x的值是否<0,如果是的話表示之前已經訪問過,我們就找到了這個重複的數 因爲題意表明一定有重複的數字 所以如果在前面都沒有返回的話 說明重複的數字就是0 直接最後返回0就好了

public int findRepeatNumber(int[] nums) {
        for (int i = 0; i < nums.length ; i++) {
           //nums[i]可能爲負(爲負是因爲這個下標對應的元素出現過了),所以應該用絕對值表示
            int index = Math.abs(nums[i]);
            if (nums[index]<0)
                return index;
            nums[index] *= (-1) ;
        }
        return 0;
}

沒錯 就是這樣粗鄙的解法,空間複雜度降爲O(1)。 我們抓住了題目的關鍵信息,長度爲n且所有數字都在0~n-1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章