一、題目
在乙個長度為 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...