[LeetCode][算法初级][数组] 30 有效的数独

30 有效的数独

https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/30/

写一下题目吧

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 '.' 表示。


翻译一下这道题目的条件:

  1. 同样的i下标里不能有两个相同的数,
  2. 同样的j坐标里不能有两个相同的数,
  3. i/3,j/3的值相同的这个范围里,也不能有两个相同的数。

我觉得根据数字比较下标会是一个比较省心且直观的方式。

遍历数组,把所有的有数字的格子的坐标都保存下来,

由于这题的数字是0-9,正好也省去了我们用hashmap的麻烦,直接用个数组搞定。

再次遍历数组.....等等,用不着啊,在第一次遍历的时候直接就可以判断起来了。

假如有当前数字的坐标记录,就去比较一下是否满足条件。假如没有当前数字的坐标记录,就把当前坐标存下来,继续遍历。

一旦发现不合规的,就返回false,结束循环,妥妥的。

# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
    i=0
    j=0
    rec = []
    hash = {}
    for i in 0..8 
        for j in 0..8
             next if board[i][j]=='.'                  
             r = rec[board[i][j].to_i]
             if r                     
                 r.each_with_index do |e, idx|
                     x,y = e[0],e[1]
                     if x==i||y==j||(x/3==i/3 && y/3==j/3)
                         return false
                     end
                 end
                 r.push [i,j] 
             else
                 rec[board[i][j].to_i] = [[i,j]]
             end             
        end
    end
    return true
end










猜你喜欢

转载自blog.csdn.net/lokira518/article/details/80271587