日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode之Valid Sudoku有效的数独(一步步改进代码)

發布時間:2025/3/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode之Valid Sudoku有效的数独(一步步改进代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:Valid Sudoku有效的數獨

題目已經十分確定的說了只有1~9,因此標記法無疑是非常好的選擇。

基本思路:對行、列、小數獨塊分別用一個size為9的數組來標記數字1~9在本行(列/塊)中是否已使用。

根據思路則不難寫出下面的代碼:

public static int startIndex = 0;public static int sudokuSize = 9;public boolean isValidSudoku(char[][] board) {int i;boolean[][] mark = new boolean[sudokuSize][sudokuSize+1];// 判斷所有行是否符合for (i = startIndex; i < sudokuSize; i++) {for (int j = startIndex; j < sudokuSize; j++) {if (board[i][j] != '.') {int temp = board[i][j] - '0';if (mark[i][temp]) return false;else mark[i][temp] = true;}}}// 判斷所有列是否符合initMarkArr(mark, false);for (i = startIndex; i < sudokuSize; i++) {for (int j = startIndex; j < sudokuSize; j++) {if (board[j][i] != '.') {int temp = board[j][i] - '0';if (mark[i][temp]) return false;else mark[i][temp] = true;}}}// 判斷所有小數獨塊是否符合initMarkArr(mark, false);for (i = startIndex; i < sudokuSize; i++) {for (int j = startIndex; j < sudokuSize; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {int temp = board[j][i] - '0';if (mark[index][temp]) return false;else mark[index][temp] = true;}}}return true;}// 初始化數組public void initMarkArr(boolean[][] arr, boolean value) {for (int j = 0; j < arr.length; j++) {Arrays.fill(arr[j], value);}}

代碼看起來有點冗余,我們稍作代碼簡化,可得如下代碼

? ? public boolean isValidSudoku(char[][] board) {boolean[][] markRow = new boolean[9][10];boolean[][] markCol = new boolean[9][10];boolean[][] markBlock = new boolean[9][10];// 多定義兩個數組可以省去初始化操作for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {int temp = board[j][i] - '0';if (markRow[j][temp]) return false;else markRow[j][temp] = true;if (markCol[i][temp]) return false;else markCol[i][temp] = true;if (markBlock[index][temp]) return false;else markBlock[index][temp] = true;}}}return true;}

對于此題,似乎沒法靠優化算法來提升效率,硬要優化的話,可以在位運算上下點功夫。

? ? public boolean isValidSudoku(char[][] board) {int[][] mark = new int[3][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {// 1左移?位,數獨中最大數為9,2^8大大小于int的maxint temp = 1 << (board[j][i] - '1');// 判斷每列是否出現重復用temp,否則|上tempif ((mark[0][j] & temp) > 0) return false;else mark[0][j] |= temp;// 每行if ((mark[1][i] & temp) > 0) return false;else mark[1][i] |= temp;//每塊if ((mark[2][index] & temp) > 0) return false;else mark[2][index] |= temp;}}}return true;}

進一步簡化代碼

? ? public boolean isValidSudoku(char[][] board) {int[][] mark = new int[3][9];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {int index = i/3 * 3 + j/3;if (board[j][i] != '.') {int temp = 1 << (board[j][i] - '1');if ((mark[0][j] & temp) > 0 || (mark[1][i] & temp) > 0 || (mark[2][index] & temp) > 0) return false;mark[0][j] |= temp;mark[1][i] |= temp;mark[2][index] |= temp;}}}return true;}

總結

以上是生活随笔為你收集整理的leetcode之Valid Sudoku有效的数独(一步步改进代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。