查詢陣列中重複的數字
阿新 • • 發佈:2019-02-03
1.一個數組長度是n+1 範圍是1~n-1 查詢至少一個數組中重複的數字
第一種方式使用點陣圖當N較大的時候會比較費記憶體。public static void main(String[] args) { //長度必須是N+1, 範圍是1~N-1 int[] a = new int[]{1,2,3,4,5,6,7,8,3,9}; System.out.println(find1(a) + ""); System.out.println(find2(a) + ""); } static int find1(int[] a){ int[] is = new int[a.length]; for(int i = 0 ; i < a.length ; i++){ is[a[i]] = ++is[a[i]]; if(is[a[i]] > 1){ return a[i]; } } return -1; } static int find2(int[] a){ int x = 0; int y = 0; do{ x = a[a[x]]; y = a[y]; }while(x != y); x = 0; //x y 獲取到折中的位置 do{ x = a[x]; y = a[y]; }while(x != y); return x; }
第二種方式使用單鏈表存在環來判斷時間複雜度雖然沒第一種快,但是節省記憶體而且時間複雜度只為N,在特定條件下是一種比較實用的演算法。