面試題3:找出陣列中重複的數字。
在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。
示例 1:
輸入:[2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
限制:2 <= n <= 100000
利用雜湊的特性,但不需要額外的儲存空間。因此時間複雜度為o(n),不需要額外空間,空間複雜度o(1)!
把當前序列當成是乙個下標和下標對應值是相同的陣列;
遍歷陣列,判斷當前位的值和下標是否相等: 2.1. 若相等,則遍歷下一位; 2.2. 若不等,則將當前位置i上的元素和a[i]位置上的元素比較:若它們相等,則成功!若不等,則將它們兩交換。換完之後a[i]位置上的值和它的下標是對應的,但i位置上的元素和下標並不一定對應;重複2.2的操作,直到當前位置i的值也為i,將i向後移一位,再重複2.。
如果沒有重複數字,那麼正常排序後,數字i應該在下標為i的位置,所以思路是重頭掃瞄陣列,遇到下標為i的數字如果不是i的話,(假設為m),那麼我們就拿與下標m的數字交換。在交換過程中,如果有重複的數字發生,那麼終止返回ture
class
solution
//for (int i = 0; i < length; i++)
for(
int i =
0; i < length; i++
)else}}
return
false
;// 若上述條件均無返回,則直接返回flase(表明陣列中並無重複的數字)
}
,和題51類似
因此時間複雜度為o(n),不需要額外空間,空間複雜度o(n)
class
solution
for(
int i =
0; i < nums.
size()
;++i)
return0;
}};
// 面試題3(二):不修改陣列找出重複的數字(和t61思路類似)
// 題目:在乙個長度為n+1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至
// 少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的
// 陣列。例如,如果輸入長度為8的陣列,那麼對應的
// 輸出是重複的數字2或者3。
#include
intcountrange
(const
int* numbers,
int length,
int start,
int end)
;// 引數:
// numbers: 乙個整數陣列
// length: 陣列的長度
// 返回值:
// 正數 - 輸入有效,並且陣列中存在重複的數字,返回值為重複的數字
// 負數 - 輸入無效,或者陣列中沒有重複的數字
intgetduplication
(const
int* numbers,
int length)
if(count >
(middle - start +1)
) end = middle;
else
start = middle +1;
}return-1
;}intcountrange
(const
int* numbers,
int length,
int start,
int end)
// ********************測試**********************
void
test
(const
char
* testname,
int* numbers,
int length,
int* duplications,
int duplength)
} std::cout << testname <<
" failed."
<< std::endl;
}
面試題3 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。1.方法一 把輸入的資料進行排序,排序後再判斷有無重複的數字,時間複雜...
面試題3 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。雜湊表int findduplicatenum vector int...
面試題3 陣列中重複的數字
leetcode面試題3 思路1 建立乙個陣列,將原陣列元素當做下標統計次數 int findrepeatnumber int nums,int numssize count times for int i 0 i numssize i no such element return 1 思路2 排序...