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

2021-10-07 07:04:11 字數 1137 閱讀 8919

一、題目

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

示例

輸入:[2, 3, 1, 0, 2, 5, 3]

輸出:2 或 3

二、分析

1.首先想到的解法是遍歷整個陣列,然後利用雜湊表統計每個數字出現的次數,如果次數大於1即返回

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

2.分析題目,由於這個nums陣列中的數字是從0~n-1共有n個數字,如果沒有重複的話,陣列中的每個數字和對應的下標是相等的,即

下標 i01

.....

n-2n-1

nums[i]01

.....

n-2n-1

但是如果存在重複數字的話,則數字和下標就不會完全對應,如下:

下標 i01

234nums[i]23

1023.針對上述情況,遍歷陣列,分析以下情況:

(1)若nums[i]==i,則說明對應上了,直接跳過迴圈

(2)若nums[i]!=i,則說明沒有對應上,需要繼續分析,再去判斷以nums[i]為下標的數字是否和下標nums[i]相等

nums[nums[i]]==nums[i];說明下標i和下標nums[i]對應的數字相等,則說明該數字重複了,直接返回nums[i];

(3)若nums[nums[i]]和nums[i]不相等,則交換下標i和下標nums[i]對應的數字,讓下標i和nums[i]對應的數字都歸位,交換之後,i沒有加1,而是繼續迴圈判斷;

(4)時間複雜度為o(n),空間複雜度為o(1),交換時產生的空間

三、**

int temp;

// for(int i=0;iif(nums[nums[i]]==nums[i]) return nums[i];

else

}return -1;

}

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

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

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

找出陣列中重複的數字。在乙個長度為 n 的陣列 nums 裡的所有數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。class solution return repeat 如果沒有重複數字,那麼正常排序後,...

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

給定乙個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。注意 如果某些數字不在 0 n 1 的範圍內,或陣列中不包含重複數字,則返回 1 樣例給定 nums 2...