2011-08-22 3 views
-6

행렬 (int [] [] 행렬)을 입력으로 받고 행렬에서 모든 최대 값을 찾아야하는 Java로 메소드를 작성하십시오. 지역 최대 값은 인접한 모든 이웃보다 큰 행렬의 숫자입니다. 메서드는 발견 된 모든 로컬 최대 숫자의 위치 목록을 반환해야합니다. 행렬에서 모든 최대 값을 찾으십시오

내가이를 만들기 위해이 코드를 시도했지만이 아이디어가 올바른지 코드의 경우 모르는

private static List<Integer> findLocal(int[][] matrix) 
{ 

    List<Integer> locals = new ArrayList<Integer>(); 

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

      if (i < matrix.length - 1 && j < matrix[0].length - 1) { 
       if (matrix[i][j] < matrix[i + 1][j] && matrix[i][j] < matrix[i][j + 1] && matrix[i][j] < matrix[i + 1][j + 1]) { 
        locals.add(i + j); 
       } else { 

       } 

      } 
     } 

    } 

    return locals; 
} 
+1

무엇을 시도 했습니까? 이 알고리즘의 어떤 부분을 찾기가 어렵습니까? 우리는 단지 당신을 위해 뭔가를 코딩하지 않을 것입니다. 우리는 * 돕기 위해 여기 있습니다. – dlev

+2

숙제가 들립니다. 지금까지 무엇을 시도 했습니까? 구체적인 문제는 어디에 있습니까? – flolo

+0

아마도 그는 어디서 어떻게 시작해야할지 모르십니까? – mort

답변

2

좋아, 지금은 당신이 아이디어 온 것, 그것은 기본적으로이다 일하는 아이디어.

당신이보고있는 neigborhood가 잘못되었습니다 : 포인트 (i, j)에 대해 (폰 노이만) 이웃은 (i + 1, j), (i, j + 1) (i-1, j), 및 (i, j-1)을 생성한다.

그래서이 지점을 확인하면 일반적으로 작동해야하지만 테두리를 특별히 관리해야합니다. 당신이 거기에있을 때 당신이 고려해야 할 그 이웃 지점을 가져갈 때 가지고있는 열이없고 n + 1 번째 열이 없다. 처리 방법은 처리 방법에 달려 있습니다. 국경선이 일정한 가치를 지니고 있다면 동네 주변을 포장해야합니까?

+0

+1 국경을 잊어 버렸습니다! –

2

당신은 요소가 이웃의 세보다 작은 여부를 확인

if (matrix[i][j] < matrix[i + 1][j] 
    && matrix[i][j] < matrix[i][j + 1] 
    && matrix[i][j] < matrix[i + 1][j + 1]) { 

물품. 다른 다섯 이웃은 어때? 이것들을 확인해 보도록하겠습니다 :

if (matrix[i][j] < matrix[i + 1][j] 
    && matrix[i][j] < matrix[i+1][j-1] 
    && matrix[i][j] < matrix[i+1][j+1] 
    && matrix[i][j] < matrix[i][j + 1] 
    && matrix[i][j] < matrix[i][j - 1] 
    && matrix[i][j] < matrix[i-1][j-1]) 
    && matrix[i][j] < matrix[i-1][j]) 
    && matrix[i][j] < matrix[i-1][j+1]) { 

이것은 요소의 즉각적인 이웃 8 개 즉, 직선과 대각선을 검사한다고 가정합니다. 이것이 원하는 것이 아닌지 조정하십시오.

또한 요구 사항은 로컬 최대 값을 찾는 것입니다. 이것은 로컬 최소값을 식별합니다. <>으로 변경하십시오.

또 다른 것은 locals.add(i + j)은 당신이 생각하는대로하지 않는다는 것입니다. 요소 (i = 3, j = 4)가 로컬 최대 값이면 locals.add(7)을 말하면서 분명히 원하는 것은 아닙니다.

+0

당신은 무어 이웃을 데려갔습니다 - 원래 포스터가 원하는 것이 확실하지 않습니다 - 폰 노이만을 더 짧게 사용했습니다 (그리고 저는 게으르다 ;-). +1 나는 잘못된 관계를 보지 못했습니다. – flolo

0

요소의 위치를 ​​올바르게 기억하려면 i와 j를 따로 저장해야합니다. 따라서

List<Integer> locals = new ArrayList<Integer>(); 

은 작동하지 않습니다.

List<Integer[]> locals = new ArrayList<Integer[]>(); 

대신 사용할 수 있습니다. 그리고, 새로 발견 지역 최대의 위치를 ​​추가 나는 모든 매트릭스 요소 8 개 비교에 대한 필요가 없다고 생각

Integer[] localMax = {i, j}; 
locals.add(localMax); 
1

를 사용합니다. 당신은 두 개의 별도의 배열을해야합니다

  1. MATRIX[n+2][n+2]을 : 그것은 모든 INT_MIN의 (그래서, 각 행렬 요소는 모두 8 개 이웃을 가지고)의 추가 층으로 행해져 Yout 입력 행렬이 포함됩니다.

  2. Mark[n+2][n+2] = {0} 행렬 요소는 로컬 최소로 선언 경우 (당신은 에 표시되지 않은 입력 행렬 요소를 방문해야한다), 당신이해야 에서 마크 모든 이웃 마크 [] [ ] 벡터.

이렇게함으로써, 복잡도는 아니하지만 (N^2) O로 유지된다. 비교는 입니다.

관련 문제