2016-10-27 18 views
-1
public static void main(String[] args) { 
    // TODO code application logic here 
    int numRows = 5; 
    int numCols = numRows; 
    int[][] twoDimArray = new int[numRows][numCols]; 
    Random randGen = new Random(); 

    for (int i = 0; i < numRows; i++) { 
     for (int j = 0; j < numCols; j++) { 
      int randIndex = randGen.nextInt(4); 
      int value = randGen.nextInt(100); 
      twoDimArray[i][j] = value; 
     } 
    } 
    System.out.println("\nThe two-dimensional array: "); 
    for (int i = 0; i < numRows; i++) { 
     for (int j = 0; j < numCols; j++) { 
      System.out.print(twoDimArray[i][j] + " "); 
     } 
     System.out.println(); 

    } 
    } 
} 

「ブルートフォース」アプローチを使用してローカル最小値を探したいとします。私は一次元の配列で私は地方の最小値を見つけるまで、私はforループを使用して配列のすべての要素を比較することを知っているが、私はここでそれを行う方法を知らない。2D配列でローカル最小値を見つけるにはどうすればよいですか?

編集:代わりにバイナリ検索を使用できますか?真ん中の行を見つけてそこで検索し、見つからなければ半分のうちの1つを探します。

+1

あなたは、2Dのコンテキスト内で局所的な最小値を定義する方法アレイ?局所的な最小値が存在するかどうかを決定するために使用される隣接要素はどれですか? – 4castle

+0

2次元配列内の極小値は、その行の最小要素で、要素の「右上」要素よりも小さく、直接その下にある必要があります。 iが行の要素であり、jが列の要素である場合、局所最小値は[i-1]、[i + 1]、[j-1]、[j + 1] –

+0

実際に時間の複雑さの点でローカル最小値を見つける最適化された方法はありません。データはソートされておらず、重複を含む可能性があるため、作成できる最適化はほとんどありません。 [この記事を参照](http://stackoverflow.com/a/12238349/5743988)。 – 4castle

答えて

1

強引な方法は、単に余分なループと、1次元配列のものと非常に類似して、そしてさらにいくつかのチェック:

public int[] findLocalMinimum(int[][] arr) { 
    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr[i].length; j++) { 

      int current = arr[i][j]; 

      if (i + 1 < arr.length && current >= arr[i + 1][j] || 
       i - 1 >= 0   && current >= arr[i - 1][j] || 
       j + 1 < arr[i].length && current >= arr[i][j + 1] || 
       j - 1 >= 0   && current >= arr[i][j - 1]) { 
       continue; 
      } else { 
       return new int[] { i, j }; 
      } 

     } 
    } 
    return new int[] { -1, -1 }; 
} 
関連する問題