劍指offer 陣列 找出陣列中重複的數字

2021-10-02 07:57:39 字數 1070 閱讀 2097

給定乙個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0∼n−1 的範圍內。

陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。

請找出陣列中任意乙個重複的數字。

注意:如果某些數字不在 0∼n−1 的範圍內,或陣列中不包含重複數字,則返回 -1;

樣例給定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。

返回 2 或 3。

oj位址:觀察資料特徵發現,有重複的數字或沒有重複數字,且數字的範圍在【0,n-1】中(特例不在【0,n-1】再特殊處理)。那問題來了,如何利用上面特徵快速的發現重複的數字?

利用陣列中數字範圍在【0,n-1】可以這樣做,因為陣列下標也是【0,n-1】,所以可將每個下標i上的數nums[i],放到nums[i]對應的下標nums[i]上,即設nums[i] = x,nums[x] = y,就是把x放在nums[x]上。至於如何放?是用交換方式,nums[i] <=>nums[x] ;交換完後 ,nums[i] = y,nums[x] = x,(可看出交換後y可能等於i,也可不等於所以i上新來的y是未知的,下面主要是依據它來判斷是否重複)至此我把數字x放在了它對應的下標中,對於交換後i上的數y,繼續重複把y放在到nums[y]上,若nums[y]已經是有nums[y]== y,那i上的y就是重複的並y一定是不等i的(現在出現了兩個y,乙個在對應自己下標y上,那另乙個y絕對不在對應自己的位置上咯,陣列下標是唯一的)。

所以繼續將nums[i]上的數一直放在它的下標的迴圈條件是nums[nums[i]] != nums[i] (也就是nums[y]!= y) ,迴圈完後判斷y是否是等於i,不等於i說明是重複的是y,等於說明y正好在自己位置上。

class

solution

for(

int i=

0;i(nums[i]

!= i)

return nums[i];}

return-1

;}void

swap

(int

arr,

int x,

int y)

}

劍指offer 找出陣列中重複的數字

問題 在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍裡,不知道重複的數字,也不知道每個重複數字重複幾次,找出陣列中所有重複的數字,如輸入,則應輸出。要求1 能改變陣列中的數字 思路1 將陣列排序,然後遍歷陣列,找出重複的數字。時間複雜度o nlogn 空間複雜度o 1 思路1的實現 vecto...

劍指offer 找出陣列中重複的數字

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

劍指offer 找出陣列中重複的數字

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。示例 1 輸入 2,3,1,0,2,5,3 輸出 2 或 3 限制 2 n 100000 暴力求解的思路非常的直接...