劍指offer 陣列中重複的數字

2022-05-08 22:15:07 字數 927 閱讀 4233

我的常規方法:

由於陣列長度n,所有資料的大小都在0到n-1之間,所以考慮把每一位上的數字都放到應該呆的位置。如果nums[i]!=i並且nums[i]該呆的位置(nums[nums[i]])已經等於nums[i]了,說明出現了重複數字。

1

class

solution

14while(numbers[i]!=i and numbers[numbers[i]]!=numbers[i])

19if(numbers[i]!=i)20}

21return

false;22

}23 };

1

bool duplicate(int numbers, int length, int*duplication)

88 numbers[index]+=length; 99

}1010return0;

1111 }

遍歷到第i位,當前數字為nums[i],那麼就在nums[i]索引處做乙個標記,即將nums[nums[i]]加上陣列的長度,以此作為標記,記錄nums[i]這個數已經出現過了。

之後如果遍歷到j(j>i),當前數字為nums[j],去檢查nums[j]索引處是不是已經做過標記了(即nums[nums[j]]的值是否大於陣列長度),如果做過標記了說明當前nums[j]就是乙個重複出現的數字。

其實寫到這,原理和我的方法是類似的,都是將遍歷過的數字在對應索引位置做好記錄,以備後期再查閱。時間複雜度同樣都是o(n),只是這個方法不列印出來每次陣列的結果,有些不好理解就是了。。

下面是執行截圖,每次迴圈都列印一次陣列的結果:

劍指offer 陣列中重複的數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。class solution 考慮這種非法輸入 for i...

劍指offer 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。分析 雖然也ac了,但是沒仔細看題,可以利用題目已有條件做到更簡單的...

劍指offer 陣列中重複的數字

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