LeetCode面試題03. 數組中重複的數字

方法一:遍歷數組
由於只需要找出數組中任意一個重複的數字,因此遍歷數組,遇到重複的數字即返回。爲了判斷一個數字是否重複遇到,使用集合存儲已經遇到的數字,如果遇到的一個數字已經在集合中,則當前的數字是重複數字。

public class Solution {
    public int FindRepeatNumber(int[] nums) {
        HashSet<int> map = new HashSet<int>();
        for(int i = 0; i < nums.Length; i++)
        {
            if(map.Contains(nums[i]))
                return nums[i];
            else
                map.Add(nums[i]);
        }
        return -1;
    }
}

方法二:類似交換排序
由於題目規定所有數字都在 0~n-1 的範圍內,因此如果沒有任何重複數字,數組從小到大排列後是下標爲i的位置對應數字i。

可以判斷i與數組中下標i位置的數字m是否相等,如果不相等,將下標i位置的數字m交換到數組中下標爲m的位置。思想其實就是不斷的遍歷將無序的數組逐漸變成有序,如果中間遇到下標位置下標i位置的數字m與下標爲m的位置數字相等,則得到最終結果。

時間複雜度:O(nlogn) (最壞情況下的排序)

空間複雜度:O(1)

public class Solution {
    public int FindRepeatNumber(int[] nums) {
        for(int i = 0; i < nums.Length; i++)
        {
            if(i != nums[i])
            {
                if(nums[nums[i]] != nums[i])
                    nums[nums[i]] = nums[i];
                else
                    return nums[i];
            }
        }
        return -1;
    }
}

 

 

 

 

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