查找數組中重複出現的元素

題目:給定一個長度爲n+1的int數組,其內元素爲1到n,數組中除一個元素外其他元素都只出現一次,求重複出現的元素。要求時間小於O(n^2),空間爲O(1)。

1、要求時間複雜度小於O(n^2),那麼肯定存在一種算法時間複雜度爲O(nlgn),想到二分查找。

public static int findDuplicate(int[] nums) {
    if (nums.length == 0 || nums == null)return 0;
    int low = 1, high = nums.length - 1, mid;
    while (low < high) {
        mid = low + (high - low) / 2;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] <= mid)
                count++;
        }
        if (count > mid)
            high = mid;
        else
            low = mid + 1;
    }
    return low;
}

2、通過位操作得到重複的位,把重複的位相加得到結果。

public int findDuplicate(int[] nums) {
    int n = nums.length-1, res = 0;
    for (int p = 0; p < 32; ++ p) {
        int bit = (1 << p), a = 0, b = 0;
        for (int i = 0; i <= n; ++ i) {
            if ((i & bit) > 0) ++a;
            if ((nums[i] & bit) > 0) ++b;
        }
        //b>a說明有重複的位
        if (b > a) res += bit;
    }
    return res;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章