--------------------------------學無止境,道亦有道-----------------------------
給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
不能更改原陣列(假設陣列是唯讀的)。
只能使用額外的 o(1) 的空間。(僅可開闢一次記憶體,不能使用遞迴方式)
時間複雜度小於 o(n2) 。(兩次迴圈)
陣列中只有乙個重複的數字,但它可能不止重複出現一次。
ps:即查詢陣列中的重複數。
示例 1:輸入: [1,3,4,2,2]
輸出: 2
示例 2:方法一:逐個選取輸入: [3,1,3,4,2]
輸出: 3
用兩個指標分別比較指向的數字,相同輸出,不同移動指標。
如上圖中所示,比較紅色與綠色指標所指向的value是否相等,相等返回紅色或綠色指標的value。若不相等,則先移動綠色指標,其步長為1。當綠色指標移動到陣列末端時,紅色指標步進1。綠色指標則移動到紅色指標index+1的位置。
以此類推,直到紅色指標移動到 nums.length-1 或者紅綠兩指標所指向的value相等時停止。
方法二:判環方式
將不同資料想成乙個節點,按照 nums[i] 的陣列原有順序進行連線,以示例一([1,3,4,2,2])為例:
在 示例一 中,起點與終點都是 「2 」 所以返回重複值——2;
同樣,在示例二([3,1,3,4,2])中也可以將陣列轉化為圖來觀察:
由圖可以看出,環出現在了 1-3 間,起點和終點為3,所以返回重複值——3。
ps:因為方法很簡單就不對**解釋了
public
intfindduplicate1
(int
nums)}}
system.out.
println
("找不到重複數,返回0");
return0;
}
優缺點:簡單易懂,實現起來方便,但消耗系統資源較大。
定義快指標——rabbit(兔子),慢指標——turtle(烏龜),兩者均從 index = 0 開始跑。
烏龜跑自己的值,兔子跑自己值的索引,即為烏龜跑了兩次。開始時 turtle 的值為0;
第一次迴圈結果:
比較值後不相等繼續跑:
第二次迴圈結果:
以此類推,在第五次迴圈後相遇,則把烏龜放到0處兔子繼續跑,但同步跑,每次步長都為1。
烏龜和兔子均跑自己的值:
經過兩次後找到相同數:
;//相遇後,兔子從相遇點出發,烏龜從起點出發
turtle =0;
while
(rabbit != turtle)
return rabbit;
}空間複雜度是對乙個演算法在執行過程中臨時占用(虛擬機器中)儲存空間大小的量度,記做s(n)=o(f(n))。
如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為o(log2n);當乙個演算法的空間複雜度與n成線性比例關係時,可表示為o(n).時間複雜度又稱為時間複雜度,乙個演算法的時間複雜度不單單是程式執行時間的值,而是乙個函式,它定性描述該演算法的執行時間。
以下內容整理自: mars93的文章——o(1), o(n), o(logn), o(nlogn)
o(n),就代表資料量增大幾倍,耗時也增大幾倍。比如常見的遍歷演算法。
o(n2),就代表資料量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間複雜度。比如氣泡排序,就是典型的o(n2)的演算法,對n個數排序,需要掃瞄n×n次。
o(logn),就代表當資料增大n倍時,耗時增大logn倍(以2為底的對數函式,比如,當資料增大256倍時,耗時只增大8倍)。比如二分查詢(每找一次排除一半的可能,256個資料中查詢只要找8次就可以找到目標)
o(nlogn),就是n乘以logn,當資料增大256倍時,耗時增大256*8=2048倍。這個複雜度高於線性低於平方。歸併排序就是o(nlogn)的時間複雜度。
o(1),就是最低的時空複雜度, 耗時或空間 與 輸入資料大小 無關,無論輸入資料增大多少倍,耗時/耗空間都不變。比如雜湊演算法,無論資料規模多大,都可以在一次計算後找到目標。
陣列中重複數字 leetcode
在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的數字,那麼對應的輸出是重複的數字2或者3。上來這道題的思路就是暴力解決,如何暴力解決這個問題呢。思路 直接雙重...
leetcode刷題 陣列重複數字
題目描述 在乙個長度為 n 的陣列裡的所有數字都在 0 到 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字 input output 2 includevoid swap int nums,int i,int j int...
LeetCode 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重...