記事のディレクトリ
タイトル説明
配列の重複した番号を検索します。
長さNUMS n個のアレイ内のすべての数値は0〜N-1の範囲です。一部のデジタル配列が重複しているが、各回数が数回繰り返したかわからない、繰り返し何の数字かわかりません。重複した数字のいずれかの配列を見つけてください。
例:
入力:
[2、3、1、0、2、5、3]
出力:2または3
説明:
2 <= N <= 100000
問題の解決策
ハッシュテーブル(javaの)
アイデア:ハッシュテーブルは、質問のタグの下で比較的簡単です。必要に応じて、実際には、解決するために構造HashMapのハッシュテーブルと直接ではないが満載ですが、また、スペースの無駄。
class Solution {
public int findRepeatNumber(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int num: nums) {
if(map.containsKey(num)) return num;
map.put(num,2);
}
return -1;
}
}
複雑性分析
- 時間計算:
- 宇宙の複雑さ:
ハッシュ表2(ジャワ)
アイデアは:構造セットは少し明確にすることができ、成功した次の要素にビューを追加し、現在の要素が返されません。
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
int repeat = -1;
for (int num : nums) {
if (!set.add(num)) {
repeat = num;
break;
}
}
return repeat;
}
}
- 時間計算:
- 宇宙の複雑さ:
交換方法(Javaの)
アイデア:タイトル状態をつかむために、デジタル長さ 0である値、及び 範囲は、実際には、繰り返されない場合は、各値に対して、それがピットニンジンである、と理解することができます。ホーミングプロセスは、リターンの数を出会いを繰り返しているなら、あなたは、アレイ内の各要素のためのホーミングを有効にすることができます。彼はあるが、 時間計算量が、それは、前の二つの方法よりもはるかに速く実行されています。
class Solution {
public int findRepeatNumber(int[] nums) {
int temp;
for(int i=0;i<nums.length;i++){
while (nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
}
- 時間計算:
- 宇宙の複雑さ: