演算法刷題及總結_陣列篇拓展
阿新 • • 發佈:2021-02-14
# 演算法刷題及總結_陣列篇拓展
## 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) {
// 初始化一個雜湊表