查找數組中重複的數字

問題描述:在長度爲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排序

相關文章
相關標籤/搜索