劍指offer 3 1陣列中重複的數字

2021-10-10 01:18:56 字數 1601 閱讀 8806

通過一次排序,只要從頭到尾掃瞄陣列中的元素,找到相鄰不相等的元素即可。

public

static

void

main

(string[

] args)

;int find =0;

arrays.

sort

(numbers)

;for

(int i =

0; i < numbers.length-

1; i++)}

system.out.

println

(find)

;//結果為2

}

時間複雜度o(nlogn),空間複雜度o(n)。

用list從頭到尾遍歷陣列,邊遍歷的同時把元素新增到list中,當遍歷到list中存在的資料是即為找到了重複元素。

public

static

void

main

(string[

] args)

; list

list =

newarraylist

<

>()

;int find =0;

for(

int num : numbers)

else

} system.out.

println

(find)

;//結果為2

}

時間複雜度o(n),空間複雜度o(n)。

設想要是沒有重複數字,那麼在0~n-1的每個數字都對應長度為n的陣列的下標,即長度為n的陣列中每個元素都等於其下標。

但是要是有重複數字,就會出現陣列元素下標不等於陣列元素值的情況。

舉個例子,陣列的第乙個元素為2,但其陣列下標為0,元素值和下標不匹配,讓我們為元素2找到它的家,即陣列下標為2的地方。交換陣列下標為2的元素,陣列變為。發現,改變後陣列第乙個元素為1,與下標為0不匹配,再為其找家,改變陣列為。同理,再次改變陣列為,自此陣列的前四個元素都找到了自己的家,但是到了第五個元素2,我們發現下標為2的家已經有了值為2的主人,因此可以斷定,第五個元素2是多餘的元素。返回多餘元素。

public

static

void

main

(string[

] args)

;int find =0;

//遍歷元素

for(

int i =

0; i < numbers.length; i++

)//若沒有找到真正主人,則交換值和下標的位置

int swap = numbers[i]

; numbers[i]

= numbers[swap]

; numbers[swap]

=swap;}}

//結果為2

}

時間複雜度o(n),儘管有兩重迴圈,但是只要交換兩次就可以找到屬於它的位置,因此時間複雜度是o(n)。空間複雜度o(1),因為都是在陣列上進行操作,不需要額外分配記憶體。

31 劍指Offer之陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路採用非暴力查詢和不消耗額外空間的演算法 陣列重排。把原陣列重新排...

劍指offer 31 連續子陣列的最大和

輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續的多個整數組成乙個子陣列,求所有子陣列和的最大值,要求時間複雜度o n 看到這個問題的時候我首先想到是 例項化乙個新陣列,用陣列元素作為下標,元素出現的個數作為陣列值,但是想想又發現不行 因為陣列裡的值不確定,因此例項化陣列的時候陣列大小就不確...

劍指offer 31 棧的壓入 彈出序列

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 思路...