Leetcode: Valid Sudoku

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.



The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

犯了很多细节上的错误,比如忽视了“-”的存在,正是因为有“-”的存在,所以不能用if (rows.size() == i)来判断rows里面是否已经存某一行,如果不存在再row = new ArrayList<Character>(); row.add(board[i][j]);rows.add(row);来添加新的一行。所以只能一开头就不辞辛苦地建一个ArrayList<ArrayList<Character>> rows,再循环九次向里面添加9个空的ArrayList<Character> row

 1 public class Solution {

 2     public boolean isValidSudoku(char[][] board) {

 3         if (board==null || board.length!=9 || board[0].length!=9) return false;

 4         ArrayList<ArrayList<Character>> rows = new ArrayList<ArrayList<Character>>();

 5         ArrayList<ArrayList<Character>> columns = new ArrayList<ArrayList<Character>>();

 6         ArrayList<ArrayList<Character>> boxes = new ArrayList<ArrayList<Character>>();

 7         for (int i=1; i<=9; i++) {

 8             rows.add(new ArrayList<Character>());

 9             columns.add(new ArrayList<Character>());

10             boxes.add(new ArrayList<Character>());

11         }

12         for (int i=0; i<board.length; i++) {

13             for (int j=0; j<board[0].length; j++) {

14                 if (board[i][j] == '.') continue;

15                 ArrayList<Character> row = rows.get(i);

16                 if (row.contains(board[i][j])) return false;

17                 else row.add(board[i][j]);

18                 

19                 ArrayList<Character> column = columns.get(j);

20                 if (column.contains(board[i][j])) return false;

21                 else column.add(board[i][j]);

22                 

23                 ArrayList<Character> box = boxes.get(getBoxNum(i, j));

24                 if (box.contains(board[i][j])) return false;

25                 else box.add(board[i][j]);

26             }

27         }

28         return true;

29     }

30     

31     public int getBoxNum(int i, int j) {

32         return (i/3)*3 + j/3;

33     }

34 }

然后在解Sudoku Solver的时候,遇到了一个很简单的解法(但是这里不适用):

 1 public class Solution {

 2     public boolean isValidSudoku(char[][] board) {

 3         if (board == null || board.length != 9 || board[0].length != 9) return false;

 4         for (int i = 0; i < 9; i++) {

 5             for (int j = 0; j < 9; j++) {

 6                 if (board[i][j] == '.') continue;

 7                 if (!isvalid(board, i, j)) return false;

 8             }

 9         }

10         return true;

11     }

12     

13     public boolean isvalid(char[][] board, int i, int j) {

14         for (int a = 0; a < 9; a++) {

15             if (a != i && board[a][j] == board[i][j]) return false;

16         }

17         

18         for (int b = 0; b < 9; b++) {

19             if (b != j && board[i][b] == board[i][j]) return false; 

20         }

21         

22         for (int c = i/3*3; c < i/3*3 + 3; c++) {

23             for (int d = j/3*3; d < j/3*3 + 3; d++) {

24                 if ((c != i || d != j) && board[c][d] == board[i][j]) return false;

25             }

26         }

27         

28         return true;

29     }

30 }

 

你可能感兴趣的:(LeetCode)