查找數組中重復的數字


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM