問題描述:在長度爲n的數組中,全部的元素都是0到n-1的範圍內。 數組中的某些數字是重複的,但不知道有幾個重複的數字,也不知道重複了幾回,請找出任意重複的數字。 例如,輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出爲2或3數組
解法一:將輸入的數組進行排序,遍歷排序後的數組找到重複的數字。排序一個長度爲n的數字的時間複雜度爲O(nlogn),因此這種方法的時間 複雜度爲O(nlogn)。spa
解法二:使用哈希表來解決這個問題。從頭至尾順序掃描數組中的每個數,沒掃描一個數字能夠用O(1)的時間在哈希表中判斷是否包含此數 字,若是哈希表中沒有此數字就將此數字加入到哈希表中,若是哈希表中已存在此數字就找到重複的數字。時間複雜度爲O(n),可是 空間複雜度也爲O(n),以空間換區時間。code
解法三:數組中的數字爲0到n-1的範圍內。若是這個數組中沒有重複的數字,則對應的i位置的數據也爲i。能夠重排此數組,掃描數組中的每 一個數字,當掃描到下標爲i的數字時,首先比較這個數字(m)是否是等於i。若是是,接着掃描下一個數字。若是不是,再拿它和第 m個數字比較,若是相等則找到重複的數據。不然就把第i個數字與第m個數字交換。重複這個比較、交換的過程,直到找到重複的數 字。blog
package com.wyl; /** * 找到數組中重複的數字 * 問題描述:在長度爲n的數組中,全部的元素都是0到n-1的範圍內。 * 數組中的某些數字是重複的,但不知道有幾個重複的數字,也不知道重複了幾回,請找出任意重複的數字。 * 例如,輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出爲2或3 * @author wyl * */ public class DuplicateNumber { public static void main(String[] args) { int[] array = {2,3,1,0,2,5,3}; int duplicate = duplicateNumber(array); System.out.println("重複的數字爲: " + duplicate); } /** * 求數組中重複的數字 * 分析:若是數組中沒有重複的數字,則第i位置應該放置的數字爲i。能夠重排此數組,讓對應位置上的數字對應。 * @param array * @return */ private static int duplicateNumber(int[] array) { // TODO Auto-generated method stub if(array == null || array.length <= 0){ return -1; } for(int i=0;i<array.length;i++){ //判斷輸入數組的合法性 if(array[i] < 0 || array[i] >= array.length){ return -1; } } for(int i=0;i<array.length;i++){ if(i != array[i] && array[i] == array[array[i]]){ //重複數據 return array[i]; } while(i != array[i]){ //將數字與第m個位置上的數字交換 exchange(array, i, array[i]); } } return -1; } /** * 交換數組array中的第i位和第j位 * @param array * @param i * @param j */ public static void exchange(int[] array, int i, int j){ int temp = array[i]; array[i] = array[j]; array[j] = temp; } }
問題描述:在長度爲n的數組中,全部的元素都是0到n-1的範圍內。
* 數組中的某些數字是重複的,但不知道有幾個重複的數字,也不知道重複了幾回,請找出任意重複的數字。
* 例如,輸入長度爲7的數組{2,3,1,0,2,5,3},那麼對應的輸出爲2或3排序