配列内で繰り返される数字(Python and C++解法)
7407 ワード
タイトル:
長さnの配列のすべての数字は0からn-1の範囲内にある.配列のいくつかの数字は重複していますが、いくつかの数字が重複していることは分かりません.数字ごとに何回繰り返されるか分からない.配列のいずれかの重複する数字を見つけてください.例えば、長さ7の配列{2,3,1,0,2,5,3}を入力すると、最初の繰り返しに対応する数字は2である.
ソース:https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&&tqId=11203&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
考え方:
1つ目の考え方:重複する数字を探すのが最も考えやすいのは、数字が重複している場合、並べ替え後の隣接する数字は必ず同じであるが、並べ替えアルゴリズムの時間複雑度はO(n*logn)であるため、先に並べ替えた後に検索することである.
第2の考え方:ハッシュテーブルを用いて配列を遍歴する際,ハッシュテーブル内にその数字が含まれているか否かを判断し,もしなければハッシュテーブルを加え,あれば重複する数字を見つけ,この方法は配列を1回遍歴するだけであるが,O(n)の空間的複雑さが必要である.
第3の考え方:テーマから与えられた情報を十分に利用し、配列が重複していない場合、下付きiにスキャンすると、配列値もiであるべきである.
重複する数字がある場合は、まずiと表記された数字(x)がiに等しいかどうかを比較し、等しい場合は次の数字に遍歴する.等しくなければ、下付きxのデータと比較し、等しい場合は重複する数字を見つけ、等しくなければ、下付きiの数字と下付きxの数字を交換し、下付きiの数字xを正しい位置に置き、上記の手順を繰り返す.
Python解法(考え方2):
C++解法(思路三):
長さnの配列のすべての数字は0からn-1の範囲内にある.配列のいくつかの数字は重複していますが、いくつかの数字が重複していることは分かりません.数字ごとに何回繰り返されるか分からない.配列のいずれかの重複する数字を見つけてください.例えば、長さ7の配列{2,3,1,0,2,5,3}を入力すると、最初の繰り返しに対応する数字は2である.
ソース:https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&&tqId=11203&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
考え方:
1つ目の考え方:重複する数字を探すのが最も考えやすいのは、数字が重複している場合、並べ替え後の隣接する数字は必ず同じであるが、並べ替えアルゴリズムの時間複雑度はO(n*logn)であるため、先に並べ替えた後に検索することである.
第2の考え方:ハッシュテーブルを用いて配列を遍歴する際,ハッシュテーブル内にその数字が含まれているか否かを判断し,もしなければハッシュテーブルを加え,あれば重複する数字を見つけ,この方法は配列を1回遍歴するだけであるが,O(n)の空間的複雑さが必要である.
第3の考え方:テーマから与えられた情報を十分に利用し、配列が重複していない場合、下付きiにスキャンすると、配列値もiであるべきである.
重複する数字がある場合は、まずiと表記された数字(x)がiに等しいかどうかを比較し、等しい場合は次の数字に遍歴する.等しくなければ、下付きxのデータと比較し、等しい場合は重複する数字を見つけ、等しくなければ、下付きiの数字と下付きxの数字を交換し、下付きiの数字xを正しい位置に置き、上記の手順を繰り返す.
Python解法(考え方2):
1 class Solution:
2 def duplicate(self, numbers, duplication):
3 if numbers is None or len(numbers) <= 0: #
4 return False
5 for i in range(len(numbers)): #
6 if numbers[i] < 0 or numbers[i] > len(numbers)-1:
7 return False
8 hash_table = []
9 for i in range(len(numbers)):
10 if numbers[i] not in hash_table:
11 hash_table.append(numbers[i])
12 else:
13 duplication[0] = numbers[i]
14 return True
15 return False
C++解法(思路三):
1 class Solution {
2 public:
3 bool duplicate(int numbers[], int length, int* duplication) {
4 if (numbers == NULL || length <= 0) //
5 return false;
6 for (int i = 0; i < length; i++) //
7 if (numbers[i] < 0 || numbers[i] > length - 1)
8 return false;
9 for (int i = 0; i < length; i++) {
10 while (numbers[i] != i) { // i i,
11 if (numbers[i] == numbers[numbers[i]]) { // i numbers[i]
12 *duplication = numbers[i];
13 return true;
14 }
15 else {
16 int swapTemp = numbers[i];
17 numbers[i] = numbers[swapTemp]; // numbers[i] = numbers[numbers[i]]
18 numbers[swapTemp] = swapTemp;
19 }
20 }
21 }
22 return false;
23 }
24 };