判斷陣列中是否有重複數字(two ways +位運算)
阿新 • • 發佈:2019-01-30
//判斷陣列中是否有重複的數字,有則返回true,沒有則返回false
//方法一:先用時間複雜度為O(nlogn)的排序將陣列重建,然後遍歷尋找
//方法二:新建一個數組型hash表,key存num[i],valu存num[i]出現的次數。時間複雜度為O(n),空間複雜度為O(n)
public static boolean Dup(int[] num){ int hash[] = new int[num.length + 1]; for (int i = 0; i < num.length; i ++){ if (hash[num[i]] == 0){ hash[num[i]] ++; } else { return true; } } return false; } //方法三:整個過程就是將陣列元素值num[i]與i進行對應,比如i = 0, num[i] = 1,num[i] != i,那麼接著判斷num[num[i]]也就是1的位置是否著num[i]即1,如果是,則說明有兩個1,返回true,若不是,則交換num[i]和num[num[i]],讓元素值1在index = 1的位置。時間複雜度為O(n),空間複雜度為O(1) public static boolean Dup(int[] num){ for (int i = 0; i < num.length; i ++){ while (num[i] != i){ if (num[num[i]] != num[i]){ int tmp = num[i]; num[i] = num[tmp]; num[tmp] = tmp; } else { return true; } } } return false; } }
//方法四:(陣列中只有唯一一個single number)要求時間複雜度為O(n),空間複雜度為O(1)
public static int singleNumber(int[] nums) {
int ret = 0;
for (int i = 0; i < nums.length; i ++){
ret = ret ^ nums[i]; //異或運算,a^b = b^a, 0^a = a.相同的兩個數異或得到0,所以最終得到的是single number
}
return ret;
}