leetcode第36题

简介: 一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点,• 每一行的数字不能重复• 每一列的数字不能重复• 9 个 3 * 3 的小棋盘中的数字也不能重复。只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满

image.png

一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点,

  • 每一行的数字不能重复
  • 每一列的数字不能重复
  • 9 个 3 * 3 的小棋盘中的数字也不能重复。

只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满。

解法一 暴力解法

需要满足三条,那就一条一条判断。

publicbooleanisValidSudoku(char[][] board) {
//判断每一行for (inti=0; i<9; i++) {
if (!isValidRows(board[i])) {
returnfalse;
        }
    }
//判断每一列for (inti=0; i<9; i++) {
if (!isValidCols(i, board)) {
returnfalse;
        }
    }
//判断每个小棋盘for (inti=0; i<9; i=i+3) {
for (intj=0; j<9; j=j+3) {
if (!isValidSmall(i, j, board)) {
returnfalse;
            }
        }
    }
returntrue;
}
publicbooleanisValidRows(char[] board) {
HashMap<Character, Integer>hashMap=newHashMap<>();
for (charc : board) {
if (c!='.') {
if (hashMap.getOrDefault(c, 0) !=0) {
returnfalse;
            } else {
hashMap.put(c, 1);
            }
        }
    }
returntrue;
}
publicbooleanisValidCols(intcol, char[][] board) {
HashMap<Character, Integer>hashMap=newHashMap<>();
for (inti=0; i<9; i++) {
charc=board[i][col];
if (c!='.') {
if (hashMap.getOrDefault(c, 0) !=0) {
returnfalse;
            } else {
hashMap.put(c, 1);
            }
        }
    }
returntrue;
}
publicbooleanisValidSmall(introw, intcol, char[][] board) {
HashMap<Character, Integer>hashMap=newHashMap<>();
for (inti=0; i<3; i++) {
for (intj=0; j<3; j++) {
charc=board[row+i][col+j];
if (c!='.') {
if (hashMap.getOrDefault(c, 0) !=0) {
returnfalse;
                } else {
hashMap.put(c, 1);
                }
            }
        }
    }
returntrue;
}

时间复杂度:整个棋盘访问了三次,如果棋盘大小是 n,那么就是 3n。也就是 O(n)。

空间复杂度:O(1)。

第一种解法的作者太太聪明了!自己规定格式这种思想,很棒。

相关文章
|
4月前
|
C++ Python
leetcode-283:移动零
leetcode-283:移动零
26 0
|
4月前
|
消息中间件 Kubernetes NoSQL
LeetCode 1359、1360
LeetCode 1359、1360
单链表反转 LeetCode 206
单链表反转 LeetCode 206
69 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
67 0
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
64 0
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
87 0
LeetCode 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
81 0
|
算法
leetcode第45题
时间复杂度:O(n)。 空间复杂度:O(1)。 这里要注意一个细节,就是 for 循环中,i < nums.length - 1,少了末尾。因为开始的时候边界是第 0 个位置,steps 已经加 1 了。如下图,如果最后一步刚好跳到了末尾,此时 steps 其实不用加 1 了。如果是 i < nums.length,i 遍历到最后的时候,会进入 if 语句中,steps 会多加 1 。
leetcode第45题
leetcode第38题
难在了题目是什么意思呢? 初始值第一行是 1。 第二行读第一行,1 个 1,去掉个字,所以第二行就是 11。 第三行读第二行,2 个 1,去掉个字,所以第三行就是 21。 第四行读第三行,1 个 2,1 个 1,去掉所有个字,所以第四行就是 1211。 第五行读第四行,1 个 1,1 个 2,2 个 1,去掉所有个字,所以第五航就是 111221。 第六行读第五行,3 个 1,2 个 2,1 个 1,去掉所以个字,所以第六行就是 312
leetcode第38题
leetcode第54题
在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。
leetcode第54题