陣列中的重複數字

2021-07-25 15:28:41 字數 2379 閱讀 3732

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。

例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。

1、排序

將陣列排序,然後掃瞄排序後的陣列即可。

時間複雜度:o(nlogn),空間複雜度:o(1)

2、雜湊表

從頭到尾掃瞄陣列,每掃瞄到乙個數字,判斷該數字是否在雜湊表中,如果該雜湊表還沒有這個數字,那麼加入雜湊表,如果已經存在,則返回該數字;

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

3、交換

0~n-1正常的排序應該是a[i]=i;因此可以通過交換的方式,將它們都各自放回屬於自己的位置;

從頭到尾掃瞄陣列a,當掃瞄到下標為i的數字m時,首先比較這個數字m是不是等於i,

如果是,則繼續掃瞄下乙個數字;

如果不是,則判斷它和a[m]是否相等,如果是,則找到了第乙個重複的數字(在下標為i和m的位置都出現了m);如果不是,則把a[i]和a[m]交換,即把m放回屬於它的位置;

重複上述過程,直至找到乙個重複的數字;

時間複雜度:o(n),空間複雜度:o(1)

(將每個數字放到屬於自己的位置最多交換兩次)交換1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include

usingnamespacestd;

boolduplicate(intnumbers,intlength,int* duplication)

for(inti=0;iwhile(numbers[i]!=i)

inttmp=numbers[i];

numbers[i]=numbers[tmp];

numbers[tmp]=tmp;

}

}

returnfalse;

}

intmain()

;

intlen=sizeof(a)/sizeof(a[0]);

intduplication;

cout << duplicate(a,len,&duplication) << endl;

cout << duplication << endl;

return0;

}

陣列中重複數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。返回描述 如果陣列中有重複的數字,函式返回true,否則返回...

陣列中的重複數字

題目 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意重複的數字。例如 如果輸入長度為7的陣列,那麼對應的輸出的重複的數字2或者3。分析 陣列中的數字都在0 n 1之間,如果沒有該陣列中沒有重複的數...

陣列中的重複數字

遍歷整個陣列,判斷是否存在與於set中,不存在將其放入即可,若存在,即找到了重複數字,跳出迴圈 public static int findbyhashset int x int re 0 set sset new hashset for int i 0 i可以對陣列進行整個遍歷,當掃瞄的下標為i的...