劍指offer 陣列中的重複數字

2021-09-21 06:39:19 字數 1470 閱讀 3185

題目:陣列中的重複數字。在乙個長度為n的陣列裡所有的數字都在0~n-1範圍,陣列中某些數字是重複的,但是不知道有幾個數字重複了,請找出陣列中任意乙個重複的數字。例如:長度為7的陣列[2,3,1,2,5,3],重複的數字是2或者3。

分析:方法(1):用兩層for迴圈,拿著每乙個資料與剩下的每乙個比較,看看有沒有再次出現時間複雜度o(n*n)(引數中ret是返回型引數,帶回那個找找到的重複數)。

bool find_duplicate1(int arr, int len, int* ret)

} }//來到這說明沒找到

return false;

}

方法(2),先排序(我們這採用快速排序),然後找出相鄰的相同的兩個元素快速排序呼叫的函式(公升序)。時間複雜度o(nlogn)

int compare(const void* a, const void* b)

bool find_duplicate2(int arr, int len, int* ret)

} //來到這,說明沒找到

return false;

}

方法(3):雜湊法。建立乙個大小為n的count陣列,從頭掃瞄原陣列中的每乙個元素,判斷在count陣列中以該元素為下標的統計值是否為1,如果已經是1了,那麼找到這個重複元素了,如果不是1,則將其置1,然後繼續下乙個元素...時間複雜度o(n),空間複雜度o(n)

bool find_duplicate3(int arr, int len, int* ret)

else

}//來到這,說明沒找到

return false;

}

方法(4):由於陣列大小為n,則下標為0~n-1,又已知陣列大小也是0~n-1,那麼我們知道,如果說元素沒有重複的話,排好序後元素i就應該在下標為i的位置上,但是現在元素有重複的。那麼我們可以從頭開始依次掃瞄原陣列中的元素,如果該元素等於其下標值,那麼就判斷下乙個元素,如果不相等,那麼該元素要麼大於該下標,要麼小於該下標,此時判斷該元素是不是等於以該元素為下標的對應元素,如果是那麼就找到重複的這個元素了,如果不是那麼就將該元素與以該元素為下標的位置上(這個過程起始是逐漸將每個元素都放在以它自己為下標的位置上,即元素與下標一一對應,如果遇到的元素是符合這種一一對應的,就看下乙個,如果不對應,那就看看之前出現過沒有,沒有出現就把它放在符合一一對應的位置上)時間複雜度o(n),空間複雜度o(1),每個元素最多2次就可以放在它應該放的位置。

bool find_duplicate4(int arr, int len, int* ret)

for (int i = 0; i < len; i++) }

for (int i = 0; i < len; i++)

else//將arr[i]放在與其對應下標的位置

}} //來到這,說明沒有

return false;

}

劍指offer 陣列中的重複數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。輸入 輸出 2或3從頭到尾依次掃瞄這個陣列中的每個數字,當掃瞄到下標為i的數字時,首先比較這個數字 用m表示 是不是等於i。如果是,則...

劍指offer 陣列中的重複數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。首先,必須對陣列進行遍歷,在遍歷過程中,在基於雜湊表實現的unord...

劍指offer 陣列中的重複數字

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 乙個陣列中在只要遇到乙個重複數字就返回該數字,那後面是否還有重複數字不許用考慮。那麼遇到重複數字問題,我們可...