2016-04-20 14 views
-3

N個の整数を含む配列Aが「マスター要素」を持っているかどうかを調べようとしています。この配列のマスター要素は、配列のn/2回以上出現する要素です。例えば配列内のマスター要素を見つける効率的なアルゴリズム?

  • アレイA={5,1,3,5,5}(この場合5)マスター要素を有しています。
  • アレイA={5,1,2,3,3}にはマスター要素がありません。

これまでのところ私のコードです。

この問題を解決する最も効率的なアルゴリズムは何ですか?

配列にマスター要素がある場合、アルゴリズムはtrueを返し、マスター要素がない場合はfalseを返す必要があります。

boolean masterElement(int[] a) { 
    int count = 0; 
    boolean check = false; 
    for (int i = 0; i < a.length/2; i++) { 
     for (int j = 0; j < a.length; j++) { 
      if (a[i] == a[j]) { 
       count++; 
      } 
     } 
     if (count >= a.length/2) { 
      check = true; 
      break; 
     } 
     count = 0; 
    } 
    return check; 
} 
+1

これまでに試したことはありますか? – Sanjeev

+2

あなたは自分でそれを最初に試してみませんか? –

+0

私の数学の知識は謝りますが、それはマスターの要素が配列で3回以上言及されていることを意味しますか? – kiradotee

答えて

0

のJava 8では、あなたはこのようにStreamsCollectorsを使用することができます。

int[] a = {5,1,3,5,5}; 
    final int n=a.length; 
    Map<Integer, List<Integer>> x = Arrays.stream(a).boxed().collect(Collectors.groupingBy(i->i)); 
    // System.out.println(x); // {1=[1], 3=[3], 5=[5, 5, 5]} 
    x.forEach((k,v)->{ 
     if(v.size()>n/2) System.out.println(k); // Check whether you need > or >= 
    }); 

上記のコード内のコメントで説明をご覧ください。

0
boolean masterElement(int[] a) { 
    int half = a.length/2; 
    for (int i = 0; i < half; i++) { 
     int count = 1; 
     for (int j = i + 1; j < a.length && count <= half; j++) { 
      if (a[i] == a[j]) { 
       count++; 
      } 
     } 
     if (count > half) { 
      return true; 
     } 
    } 
    return false; 
} 
関連する問題