原題鏈接: https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
題目描述
在一個長度爲 的數組 裏的所有數字都在 ~ 的範圍內。 數組中某些數字是重複的,但不知道有幾個數字是重複,也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。
思路分析
通過閱讀提幹,不難發現,題目要求是從已知數組中找到重複元素即可。這裏列出三種解題思路僅作參考:
1)最容易想到的算法自然是先排序後通過依次遍歷並與後一個元素相比較找出第一個重複元素即可,易想到但是算法代價大不可取,最優時間複雜度爲 ;
2)利用數據結構–
hash
結構,依次遍歷數組中每一個元素,同時將元素放入hash
中,在放入前先做判斷:如果在hash
存在則說明找到重複元素,否則放入hash
中,直到遍歷完所有元素爲止,其時間複雜度爲 ,空間複雜度爲 ;3)充分利用已知條件“數組裏的所有數字都在 ~ 的範圍內”,通過交換元素位置比較可以發現是否有重複元素,爲本題最優解,其時間複雜度爲 :
(1)原地改動數組,空間複雜度爲 ;
(2)定義新數組,空間複雜度爲 。
參考代碼
方法一:複製數組,時間複雜度爲 ,空間複雜度爲 。
class Solution {
public int findRepeatNumber(int[] nums) {
int[] arr = new int[nums.length];
for(int i = 0; i < nums.length; i++) {
arr[nums[i]]++;
if (arr[nums[i]] > 1 ) {
return nums[i];
}
}
return -1;
}
}
運行結果如下:
方法二:原地修改數組,時間複雜度爲 ,空間複雜度爲 。
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] != i) {
if (nums[nums[i]] == nums[i]) {
return nums[i];
}
int temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
}
}
return -1;
}
}
運行結果如下:
參考資料
- 《劍指offer》(第2版)