反転しの最小数は零行列にバイナリマトリクスを変換します

与えられた  m x n バイナリ行列  mat1つのステップでは、1つのセルを選択し、彼らは(フリップが1に0と0に1を変更している)が存在する場合に、それのすべての4人の隣人を反転させることができます。彼らは一つのエッジを共有する場合、細胞のペアがneighboorsと呼ばれています。

戻り値は  、ステップの最小数は、  変換するために必要な  mat ゼロ行列やに  -1  あなたができない場合。

バイナリ行列は、全てのセルのみ0または1に等しいとマトリックスです。

ゼロ行列は0に等しいすべてのセルを有する行列です。

 

例1:

Input: mat = [[0,0],[0,1]]
Output: 3
Explanation: One possible solution is to flip (1, 0) then (0, 1) and finally (1, 1) as shown.

アイデア:BFSは、難易度は状態ボードの表現ということで、難しいことではないことを、文字列に変換ハオが書いたインタビューヘルパー機能、収集するのが最も簡単です。

時間:O(2 ^ MN)容量:O(M * N *はsizeof(文字列(M * N)))

class Solution {
    public int minFlips(int[][] mat) {
        if(mat == null || mat.length == 0 || mat[0].length == 0) {
            return 0;
        }
        int n = mat.length;
        int m = mat[0].length;
        
        if(isallzero(boardToString(mat))) {
            return 0;
        }
        
        Queue<String> queue = new LinkedList<String>();
        HashSet<String> visited = new HashSet<String>();
        queue.offer(boardToString(mat));
        visited.add(boardToString(mat));
        boolean find = false;
        
        int step = 0;
        while(!queue.isEmpty() && !find) {
            int size = queue.size();
            for(int i = 0; i < size; i++) {
                String head = queue.poll();
                if(isallzero(head)) {
                    return step;
                }
                List<String> neighbors = getAllNeighbor(head, n, m);
                for(String neighbor: neighbors) {
                    if(!visited.contains(neighbor)) {
                        visited.add(neighbor);
                        queue.offer(neighbor);
                    }
                }
            }
            step++;
        }
        return find == false ? -1 : step;
    }
    
    private List<String> getAllNeighbor(String matstr, int n, int m) {
        List<String> list = new ArrayList<String>();
        int[][] mat = stringToBoard(matstr, n, m);
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                list.add(changeboard(mat, i, j));
                changeboard(mat, i, j);
            }
        }
        return list;
    }
    
    private String changeboard(int[][] mat, int x, int y) {
        int[] dx = {0,0,-1,1};
        int[] dy = {-1,1,0,0};
        int n = mat.length;
        int m = mat[0].length;
        
        mat[x][y] = (mat[x][y] == 0) ? 1 : 0;
        for(int k = 0; k < 4; k++) {
            int nx = x + dx[k];
            int ny = y + dy[k];
            if(0 <=nx && nx < n && 0 <= ny && ny < m) {
                mat[nx][ny] = (mat[nx][ny] == 0) ? 1 : 0;
            }
        }
        return boardToString(mat);
    }
    
    private String boardToString(int[][] mat) {
        int n = mat.length;
        int m = mat[0].length;
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                sb.append(mat[i][j]);
            }
        }
        return sb.toString();
    }
    
    private int[][] stringToBoard(String matstr, int n, int m) {
        int[][] mat = new int[n][m];
        for(int i = 0; i < matstr.length(); i++) {
            mat[i / m][ i % m] = matstr.charAt(i) - '0';
        }
        return mat;
    }
    
    private boolean isallzero(String matstr) {
        for(int i = 0; i < matstr.length(); i++) {
            if(matstr.charAt(i) != '0') {
                return false;
            }
        }
        return true;
    }
}

 

公開された675元の記事 ウォン称賛13 ビュー180 000 +

おすすめ

転載: blog.csdn.net/u013325815/article/details/105284085
おすすめ