題目:給定一個長度爲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;
}