1. 程式人生 > >演算法刷題及總結_陣列篇拓展

演算法刷題及總結_陣列篇拓展

# 演算法刷題及總結_陣列篇拓展 ## 1.劍指 Offer 03. 陣列中重複的數字【難度指數:★☆☆】 ### 題目描述 在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。 ```java 示例 1: 輸入: [2, 3, 1, 0, 2, 5, 3] 輸出:2 或 3 限制: 2 <= n <= 100000 ``` ### 方法一(暴力法) #### 解題思路 沒什麼好說的,暴力法,雙迴圈解決。[]~( ̄▽ ̄)~* ------ #### 程式碼實現 ```java public static boolean duplicate(int[] nums,int[] duplication) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { // duplication為已經定義好的陣列,把發現的重複數字存入該陣列第一個位置返回即可 if (nums[i] == nums[j]) { duplication[0] = nums[i]; return true; } } } return false; } ``` #### 演算法分析 由於採用了雙迴圈依次比較相互之間兩個元素,所以時間複雜度顯而易見為O(n^2),空間複雜度為O(1)。當然,因為已知2 <= n <= 100000,如果陣列是較大量級,則耗費時間太久,所以演算法必須進行優化。 ------ ### 方法二(雜湊表) #### 解題思路 在暴力解法中,我們先遍歷每一個元素,然後再從其餘的元素中查詢這個元素是否存在,其實這裡要的就是能高效的判斷一個元素是否已經存在,我們可以使用雜湊表,因為雜湊表判斷是否存在的時間複雜度是 O(1)。 虛擬碼 1. 先初始化一個雜湊表 (HashSet) 2. 然後遍歷每一個元素,分別對每一個元素做如下的處理: * 先判斷雜湊表中是否存在這個元素; * 如果存在的話,則說明這個元素重複,則直接返回; * 否則,將這個元素加入到雜湊表中,方便後續的判重。 ------ #### 程式碼實現 ```java public static boolean duplicate(int[] nums,int[] duplication) { // 初始化一個雜湊表