通過一次排序,只要從頭到尾掃瞄陣列中的元素,找到相鄰不相等的元素即可。
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就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 思路...