題目:找出陣列中的重複數字
在乙個長度為n的陣列裡的所有數字都在0~n-1的範圍內。陣列中某些數字是重複的,但不知道有哪幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者是3。
第一種方法: 暴力解決
對於每乙個數字都掃瞄一遍剩下的所有數字看有沒有重複的。這樣我們的時間複雜率是o(n²)**如下:
for(int i=0;i第二種方法: 排序解決
我們先排序,然後從陣列中找到乙個重複的數字是很容易的,只需要從頭到尾的掃瞄陣列。但是排序乙個長度為n的陣列需要o(nlogn)的時間複雜率,在排序的時候,應該選擇合適的排序方法,對於不同的資料,選擇的排序演算法也不一樣,相對於的時間複雜度和空間複雜度也不一樣。
第三種方法:雜湊表
對於雜湊表,我們從頭到尾的去掃瞄陣列中的每乙個數字,每掃瞄乙個數字的時候,都可以用o(1)的時間表來判斷雜湊表裡是否包含該數字。時間複雜度 o(n),但是他的空間複雜度是o(n);
第四種方法:
從頭到尾的掃瞄這個陣列,掃瞄到下標為i的數字時,首先比較這個數字(用m表示)是不是等於i,如果是,則接著掃瞄下乙個數字;如果不是,則再拿他和第m個數字進行比較;如果是他和第m個數字相等,就找到了第乙個重複的數字;如果不相等它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置。
eg:2 ,3 , 1 , 0 , 2 , 5 , 3 比較0號下標 0!=2 交換
1 ,3 , 2 , 0 , 2 , 5 , 3 交換後,比較0號下標,不相等, 交換
3 ,1 , 2 , 0 , 2 , 5 , 3 交換後,比較0號下標,不相等, 交換
0 ,1 , 2 , 3 , 2 , 5 , 3 交換後,比較0號下標,相等, 比較1號
1 2 3號位的數字相等,看4號位,4號位是2 所以找到了第乙個相同的數字
時間複雜度o(n) 空間複雜度 o(1)
**:bool duplicate(int numbers,int length,int *duplication)
for(int i=0;ilength-1)
return false
} for(int i=0;iint temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
} }return false;
}
1 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。從頭到尾依次遍歷陣列,比較下標為i的數字 用m表示 是否等於i。如果...
1 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。返回描述 如果陣列中有重複的數字,函式返回true,否則返回false...
1 找出陣列中重複的數字
方法1 通過構建hashmap,記錄每個值的重複情況。複雜度 o n o 1 class solution mapmap new hashmap for int i 0 i nums.length i else return 1 方法2 由於題目特徵,構建1 n 1的桶 將每個數字放到對應下標的正確...