《劍指offer》:[51]陣列中的重複數字
題目:在一個長度為n的陣列裡所有數字都在0到n-1的範圍裡。陣列中某些數字是重複的,但是不知道有幾個數字重複了,也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3.
分析:其實這個題因為它的限制太多,這樣是這個題失去了泛型,比如裡面的數字的範圍確定在0到n-1內,還有任意意對即可,不能對任意的陣列進行查重操作。下面先來看看這個問題怎麼解決吧!
方案一:時間複雜度為O(N*N)的順序掃描法。從第一個掃描到最後,依次進行第二個....一定能找出。
方案二:時間複雜度為O(N)+輔助空間O(N)的雜湊表。將每個數對映到雜湊表,掃描一遍能統計出所有數字出現的次數。然後掃描雜湊表能在O(1)的時間內得到該資料出現的次數。這樣便能找到重複的數字了。
方案三:時間複雜度為0(N),並且不要輔助空間。
思想是這樣的:順序掃描陣列的每個數字。當掃描到下標為i的數字時,比較該數字M是不是與下標i相等,如等,掃描下一個;如不等,再把它M和下標為M的數字相比較,如果相等,則找到一個返回;如果不等,則交換它們的值。
分析:其實這個題因為它的限制太多,這樣是這個題失去了泛型,比如裡面的數字的範圍確定在0到n-1內,還有任意意對即可,不能對任意的陣列進行查重操作。下面先來看看這個問題怎麼解決吧!
方案一:時間複雜度為O(N*N)的順序掃描法。從第一個掃描到最後,依次進行第二個....一定能找出。
方案二:時間複雜度為O(N)+輔助空間O(N)的雜湊表。將每個數對映到雜湊表,掃描一遍能統計出所有數字出現的次數。然後掃描雜湊表能在O(1)的時間內得到該資料出現的次數。這樣便能找到重複的數字了。
方案三:時間複雜度為0(N),並且不要輔助空間。
思想是這樣的:順序掃描陣列的每個數字。當掃描到下標為i的數字時,比較該數字M是不是與下標i相等,如等,掃描下一個;如不等,再把它M和下標為M的數字相比較,如果相等,則找到一個返回;如果不等,則交換它們的值。
以陣列a[7]={2,3,1,0,2,5,3}為例,分析如下圖所示:
#include <iostream>
using namespace std;
int arr[7]={2,3,1,0,2,5,3};
void Swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
bool duplicate(int array[],int length,int *duplication)
{
if(array==NULL || length<0)
return false;
for(int i=0;i<length;i++)
{
if(array[i]<0 || array[i]>length-1 )
return false;
}
for(int i=0;i<length;++i)
{
while(array[i]!=i)
{
if(array[i]==array[array[i]])
{
*duplication=array[i];
return true;
}
Swap(array[i],array[array[i]]);
}
}
return false;
}
int main()
{
int result;
bool res;
res=duplicate(arr,7,&result);
if(res)
cout<<"重複的數是:"<<result<<endl;
else
cout<<"資料裡沒有重複的數!"<<endl;
system("pause");
return 0;
}
執行結果:
相關文章
- 劍指Offer--陣列中重複的數字陣列
- [劍之offer] 03 陣列中重複的數字陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 【劍指offer】數字在排序陣列中出現的次數排序陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 【劍指offer】陣列中的逆序對陣列
- 《劍指offer》:[40]陣列中只出現一次的數字陣列
- 【劍指offer】陣列中只出現一次的數字(1)陣列
- 【劍指offer】陣列中只出現一次的數字(2)陣列
- 《劍指offer》:[38]數字在排序陣列中出現的次數排序陣列
- 【劍指offer】把陣列排成最小的數陣列
- 陣列中重複的數字陣列
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 劍指offer之列印超過陣列一半的數字陣列
- 劍指 offer(1) -- 陣列篇陣列
- 【劍指offer】二維陣列中的查詢陣列
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 劍指Offer-37-陣列中逆序對陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 【劍指offer】【1】二維陣列中的查詢陣列
- (python版)《劍指Offer》JZ06:旋轉陣列的最小數字Python陣列
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- 每日一題 - 劍指 Offer 53 - I. 在排序陣列中查詢數字 I每日一題排序陣列
- JZ-050-陣列中重複的數字陣列
- 刪除排序陣列中的重複數字排序陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指Offer-連續子陣列中的最大和陣列