2016-09-24 10 views
-1

配列に格納されている最大と最小の整数値を出力しようとしています。私は最高を印刷することができますが、最低のために私は正しい結果を得ていません。配列に格納されている最高と最低の番号を見つける方法は?

以下の私の二つのクラス考えてみましょう:正しいか、他のいくつかの間違いがあるない場合

class ArrayUtilityNew 
{ 
    public static int findMaxMin(int a[]) 
    { 
     int n=a.length; 
     int n2=n-1; 
     int minNo=0; 
     int count=0; 
     int maxNo=0; 

     for(int i=0;i<n;i++) 
     { 
      for(int j=0;j<n;j++) 
      { 
       if(a[i]<a[j])count++; 

      } 
      //This gives the highest no. if the count is 0 
      if(count==0) 
      { 
       maxNo=a[i]; 

      } 

      //Lowest no. shall be gained here if the count is greater 
      // than the no of elements in the array 

      // if(count>n) 
      // { 
      // minNo=a[i]; 
      // } 

      count=0; 
     } 
     return maxNo;    
    } 

} 

class ArrayInteractionsNew 
{ 
    public static void main(String arr[]) 
    { 
     int one[]={3,20,1999,2,10,8,999}; 
     int answer=ArrayUtilityNew.findMaxMin(one); 
     System.out.println("The highest no in the array is "+answer); 
    }   
} 

第二の背後にあるロジックですか?

どのように修正できますか?

答えて

3

私はより良い、より効率的なソリューションはこのことでしょう...あなたのソリューションは、あまりにも複雑だと思いますリストやストリームを使うことができるので、リストやストリームを使うことができます。

EDIT:以下曖昧コードと効率について説明java8でストリーミングAPIに

+0

リストを使用すると効率が向上するのはなぜですか?配列のアクセスは非常に高速であり、動的長さは必要ありません。 – hexafraction

+0

コードが不完全です。値を返すのはどうですか? intを返す関数でminとmaxの値を返すのはどうでしょうか? – ElChupacabra

+0

@ hexafractionこれは1ライナーなので。しかし、ええ、配列は、いくつかの行が必要ですが、より高速です。 – Fouss

1

あなたの答えはn^2です。最小値と最大値を求めるためには、nだけが必要です。

つまり、線形に見えるだけです。

リストを1回ループするループを実行します。あなたが行くように最小と最大を追跡します。最初にmin = maxvalueとmax = minvalueを設定します。 minより小さい値を見つけると、新しいminになります。

擬似コードの例です。

min = max_int 
max = min_int 
for (i=0; i < array.length; i++) 
    if array[i] < min 
     min = array[i] 
    if array[i] > max 
     max = array[i] 
0

あなたのアプローチは、うまくいけば、不必要に複雑です。

  • 2つの変数:minNomaxNoを作成します。
  • セットminNo = Integer.MAX_VALUEmaxNo = Integer.MIN_VALUEです。
  • 配列をループします。要素が>= maxNoの場合は、その値をmaxNoに割り当てます。また、(代わりにではなく、else if!)、要素が<= minNoの場合は、その値をminNoに割り当てます。
  • ループの後、minNomaxNoが正しく割り当てられます。

    int n=a.length; 
    int minNo=a[0]; 
    int maxNo=a[0]; 
    
    for(int i=1;i<n;i++) 
    { 
        if(a[i] > maxNo) { 
         maxNo = a[i]; 
        } else if(a[i] < minNo) { 
         minNo = a[i]; 
        } 
    } 
    
    // do whatever you want with maxNo and minNo 
    
    また

    (コードサイズの方法で)、さらに効率的な方法は、に次のようになります。

0

おかげで、これは、二つのライナーである:

int[] array = new int[] {5,7,2,9,10,24,3,23}; 

int min = IntStream.of(array).min().getAsInt(); 
int max = IntStream.of(array).max().getAsInt(); 

以上効率的な3-ライナーとして:

Arrays.parallelSort(array); 
int min = array[0]; 
int max = array[array.length -1]; 
+0

minmax()でIntStreamを拡張するのはどうですか? –

+0

OPは学習中です。彼の頭の上に少しこれはないですか? – netskink

+1

第2の解決法はさらに効率が悪い。時間複雑度解1:2n - > o(n)。時間複雑度解2:o(n * logn)[クイックソート]。 – Journeycorner

4

int[]minmaxに返すことができます。アレイ上に2つの要素のループの配列で開始

public static int[] findMinMax(int[] a) { 
    int[] result = { Integer.MAX_VALUE, Integer.MIN_VALUE }; 
    for (int i : a) { 
     result[0] = Math.min(result[0], i); 
     result[1] = Math.max(result[1], i); 
    } 
    return result; 
} 

ような結果は、最初の要素が最小値 された状態で配列されます。そして、それをテストするために、

public static void main(String[] args) { 
    int[] arr = { 3, 20, 1999, 2, 10, 8, 999 }; 
    int[] minMax = findMinMax(arr); 
    System.out.printf("%s: min=%d, max=%d%n", 
      Arrays.toString(arr), minMax[0], minMax[1]); 
} 

そして、私は(私が期待するよう)for-each loopとここ

[3, 20, 1999, 2, 10, 8, 999]: min=2, max=1999 

を取得。
第2の素子は最大です。

+0

なぜfindMinMax()が公開されていますか?あなたはそれが他のクラスから電話したいと思っていますか?静的メソッドはperefixクラスで呼び出す必要があります。配列の代わりに2つのプロパティを持つデータオブジェクトを使用しないのはなぜですか? –

+0

@RomanC "静的メソッドはクラスperefixで呼び出す必要があります"静的にインポートするか、同じクラスの 'main'メソッドにあります。 –

+0

@AndyTurner Huh?静的インポートはJava 7以上でのみ利用可能です*他のユーザーは同じクラスでも接頭辞を使用する必要があります。 –

0
public static void minMax(int []arr){ 
    int min = arr[0]; 
    int max = arr[0]; 
    for(int i=1; i<arr.length; i++){ 
     min = Math.min(min,arr[i]); 
     max = Math.max(max,arr[i]); 
    } 
//do whatever you want with the max and min 
} 
+0

代わりにコードだけを投稿すると、コードが役立つ説明が追加されますので参考にしてください。 –

関連する問題