JSは配列内の繰り返し番号を見つけます
長さ n の配列 nums 内のすべての数値は、0 から n-1 の範囲にあります。配列内の一部の数値が繰り返されていますが、繰り返される数値の数がわかりません。また、各数値が何回繰り返されるかもわかりません。配列内で繰り返される数値を見つけてください。
- 例 1:
入力: [2、3、1、0、2、5、3]
出力: 2 または 3
制限: 2 <= n <= 100000
- 問題解決のアイデア:
1. 一般的な考え方は、入力配列をソートし、ソートされた配列から繰り返しの数値を見つけることです。ソートされた配列を最初から最後までスキャンするだけです。長さ n の配列のソートには O(nlogn) の時間計算量が必要です
2. 2 番目のアイデアは、ハッシュ テーブルを使用してそれを解決することです。配列内の数値を最初から最後までスキャンします。数値をスキャンするたびに、O(1) 時間をかけて、その数値がハッシュ テーブルに含まれているかどうかを判断します。数値が既にハッシュ テーブルに存在する場合は、重複する数値を見つけます。 . 番号がハッシュ テーブルに存在しない場合は、ハッシュ テーブルに追加します。このアイデアの時間計算量は O(n)、空間計算量は O(n) です。
3. ここで、配列のインデックスを使用します。配列内の数値を最初から最後までスキャンします。添え字 i の付いた数値がスキャンされると、最初に数値 (m で示される) が i と等しいかどうかを比較します。したがって、次の番号のスキャンを続けます。そうでない場合は、それを m 番目の番号と比較し、それが m 番目の番号と等しい場合は、重複した番号が見つかったことになります (番号は下付き文字 i と m の両方に表示されます)。 ; m 番目の数値と等しくない場合は、i 番目の数値と m 番目の数値を交換し、m をその値が属する場所に置きます。次に、重複する番号が見つかるまで、この比較と交換のプロセスを繰り返します。
方法 1: 配列の並べ替えを使用する
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
var m=[];
if (nums == null || nums.length < 0) {
return -1;
}
// 题目的条件是数组 nums 里的所有数字都在 0~n-1 的范围内
for (let i = 0, length = nums.length; i < length; i++) {
if (nums[i] < 0 || nums[i] > length - 1) {
return -1;
}
}
// 排序
nums=nums.sort();
for(var i=0;i<nums.length-1;i++){
if(nums[i]==nums[i+1]) {
return nums[i];
}
}
}
findRepeatNumber([2,3,1,0,2,5,3]);
方法 2: ハッシュ テーブルを使用する
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
if (nums == null || nums.length < 0) {
return -1;
}
// 题目的条件是数组 nums 里的所有数字都在 0~n-1 的范围内
for (let i = 0, length = nums.length; i < length; i++) {
if (nums[i] < 0 || nums[i] > length - 1) {
return -1;
}
}
// 哈希表
let map = new Map();
for(let i of nums){
if(map.has(i)) return i;
map.set(i, 1);
}
return null;
};
findRepeatNumber([2,3,1,0,2,5,3]);
方法 3: インプレース交換
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
if (nums == null || nums.length < 0) {
return -1;
}
// 题目的条件是数组 nums 里的所有数字都在 0~n-1 的范围内
for (let i = 0, length = nums.length; i < length; i++) {
if (nums[i] < 0 || nums[i] > length - 1) {
return -1;
}
}
// 思路就是把数字放到对应的索引上 比方说数字3放到索引3的位置
for (let i = 0; i < nums.length; i++) {
// 如果当前数字跟对应的索引不相同则交换
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
let temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
};
findRepeatNumber([2,3,1,0,2,5,3]);
同じテキストの短い書籍番号へようこそ: JS は配列内の繰り返し番号を見つけます