《剑指offer》c++版本 3.数组中重复的数字
如題:
題目描述 在一個長度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)。 數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個數(shù)字 是重復(fù)的。也不知道每個數(shù)字重復(fù)幾次。請找出數(shù)組中任意一個重復(fù)的數(shù)字。 例如,如果輸入長度為7的數(shù) 組{2,3,1,0,2,5,3},那么對應(yīng)的輸出是第一個重復(fù)的數(shù)字2。方法由很多,四種,顯然,排序法和哈希查找法都可以。第三種方法比較巧妙,利用了題目中數(shù)字都在0~n-1這個限制,第四種方法,也就是暴力遍歷法,能解決問題,但不推薦。
方法1:排序法:使用快速排序,平均時間復(fù)雜度為O(nlogn),最壞O(n^2),需要修改原數(shù)組,和暴力遍歷法相同,。
方法2:哈希查找法:將數(shù)組中元素依次加入hash表中,遇到重復(fù)的元素即可返回,時間復(fù)雜度為O(1),但需使用額外O(n)的空間。
方法3:方法三就比較巧妙了,這也是劍指推薦的方法,時間復(fù)雜度為O(n),劍指上很多題目,其實(shí)都是可以通過查找規(guī)律,找到更好的方法。這道題,數(shù)組長度為n,數(shù)字范圍為0~n-1,顯然,如果不重復(fù),排好序后,每個元素都應(yīng)該存在自己值對應(yīng)的下標(biāo)中。因此,我們遍歷從0遍歷數(shù)組,將遍歷到的值,替換到其對應(yīng)下標(biāo)所在位置,如果已經(jīng)存在,說明重復(fù),返回即可。
方法4:暴力遍歷法,只有在無路可走的情況下,方可出此下策,時間復(fù)雜度為O(n^2)。雙重循環(huán),對于每一個元素,遍歷其后的數(shù)組,查找相同元素。
方法2,3是比較容易想到的,有經(jīng)驗(yàn)的話,看到數(shù)字范圍0~n-1也比較容易想到第三種,新手可能選擇第四種。下面是c++語言的版本方法3。
class Solution { public:// Parameters:// numbers: an array of integers// length: the length of array numbers// duplication: (Output) the duplicated number in the array number// Return value: true if the input is valid, and there are some duplications in the array number// otherwise falsebool duplicate(int numbers[], int length, int* duplication) {int i, val;//特殊情況處理if (length < 2)return false;*duplication = -1;//遍歷數(shù)組for (i = 0; i < length;){if (numbers[i] == i)i++;else if (numbers[i] == numbers[numbers[i]]){*duplication = numbers[i];return true;}else{val = numbers[numbers[i]];numbers[numbers[i]] = numbers[i];numbers[i] = val;} }return false;} };=============================================================================================
Linux應(yīng)用程序、內(nèi)核、驅(qū)動,后臺開發(fā)交流討論群(745510310),感興趣的同學(xué)可以加群討論、交流、資料查找等,前進(jìn)的道路上,你不是一個人奧^_^。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的《剑指offer》c++版本 3.数组中重复的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国人保的全称
- 下一篇: s3c2440移植MQTT