Duplicate51(陣列中重複的數字)
阿新 • • 發佈:2018-12-12
/** * @author LemonLin * @Description :Duplicate51 * @date 2018/9/20-11:29 * * 陣列中重複的數字: * 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。 * 也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3}, * 那麼對應的輸出是第一個重複的數字2。 * * * 思路一:時間複雜度O(n),空間複雜度O(n) * 利用一個新開闢的陣列來儲存每次讀取的給定的陣列值,比如給定陣列為{4,2,1,5,6,0,1} * 那麼讀取到4,就在新陣列的下標為4的地方存入4,讀取2,存入2,以此類推,存入之前判斷一下陣列中是否 * 已經存在這個數,如果存在就找到了對應的一個重複的數 * * * 思路二:時間複雜度O(n),空間複雜度O(1) * * 如果這個陣列中沒有重複的數字,那麼排序完數字i將出現在下標為i的位置; * 從頭到尾依次掃描這個陣列中的每個數字。當掃描到下標為i的數字時,用一個m來暫存,對比是不是等於i. * 如果是,接著掃描下一個數字。 * 如果不是,再拿它和第m個數字進行比較。 * 如果它和第m個數字相等,就找到了一個重複的數字 * 如果不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置 * * * * * */ public class Duplicate51 { /** *@Description *@params numbers: an array of integers * * length: the length of array numbers * * duplication: (Output) the duplicated number * * in the array number,length of duplication array is 1,so using duplication[0] *@author LemonLin *@date 2018/9/20 */ public boolean duplicate(int numbers[],int length,int [] duplication) { int temp=0; for (int i=0;i<numbers.length;i++){ temp = numbers[i]; if (temp == i){ continue; }else if (temp == numbers[temp]){ duplication[0]=temp; return true; }else { int temp2=0; temp2 = numbers[temp]; numbers[temp]=numbers[i]; numbers[i] = temp2; i--; } } return false; } public static void main(String[] args) { int test[]={2,3,1,0,2,5,3}; Duplicate51 duplicate51 =new Duplicate51(); int duplicate[]={0}; duplicate51.duplicate(test,test.length,duplicate); System.out.println(duplicate[0]); } }