03. Leetcode顔質問アレイ重複番号

タイトル説明

配列の重複した番号を検索します。

長さ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;
    }
}

複雑性分析

  • 時間計算: ザ・ N O(N)
  • 宇宙の複雑さ: ザ・ N O(N)

ハッシュ表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;
    }
}
  • 時間計算: ザ・ N O(N)
  • 宇宙の複雑さ: ザ・ N O(N)

交換方法(Javaの)

アイデア:タイトル状態をつかむために、デジタル長さ n個 n個 0である値、及び n個 - 1 N-1 範囲は、実際には、繰り返されない場合は、各値に対して、それがピットニンジンである、と理解することができます。ホーミングプロセスは、リターンの数を出会いを繰り返しているなら、あなたは、アレイ内の各要素のためのホーミングを有効にすることができます。彼はあるが、 ザ・ N O(N) 時間計算量が、それは、前の二つの方法よりもはるかに速く実行されています。

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;
    }
}
  • 時間計算: ザ・ N O(N)
  • 宇宙の複雑さ: ザ・ 1 O(1)
公開された43元の記事 ウォン称賛20 ビュー1447

おすすめ

転載: blog.csdn.net/Chen_2018k/article/details/104889883