問題描述:在長度為n的數組中,所有的元素都是0到n-1的范圍內。 數組中的某些數字是重復的,但不知道有幾個重復的數字,也不知道重復了幾次,請找出任意重復的數字。 例如,輸入長度為7的數組{2,3,1,0,2,5,3},那么對應的輸出為2或3
解法一:將輸入的數組進行排序,遍歷排序后的數組找到重復的數字。排序一個長度為n的數字的時間復雜度為O(nlogn),所以這種方法的時間 復雜度為O(nlogn)。
解法二:使用哈希表來解決這個問題。從頭到尾順序掃描數組中的每一個數,沒掃描一個數字可以用O(1)的時間在哈希表中判斷是否包含此數 字,如果哈希表中沒有此數字就將此數字加入到哈希表中,如果哈希表中已存在此數字就找到重復的數字。時間復雜度為O(n),但是 空間復雜度也為O(n),以空間換區時間。
解法三:數組中的數字為0到n-1的范圍內。如果這個數組中沒有重復的數字,則對應的i位置的數據也為i。可以重排此數組,掃描數組中的每 一個數字,當掃描到下標為i的數字時,首先比較這個數字(m)是不是等於i。如果是,接着掃描下一個數字。如果不是,再拿它和第 m個數字比較,如果相等則找到重復的數據。否則就把第i個數字與第m個數字交換。重復這個比較、交換的過程,直到找到重復的數 字。
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