LeetCode 36、有效的数独

题目描述:

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

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

解题思路:

一个有效的9x9数独需要满足三个条件,数字1-9在每行、每列、每个九宫格中只能出现一次;因此,只需要判断每一个数字在所在的行、所在的列、所在的个九宫格中出现的次数,就可以判断一个数独是否有效。

具体做法是:创建二维数组rows和columns用于记录一个数字在每行或每列的出现次数,其中横坐标表示数字所在的行或列,纵坐标表示待验证的数字,数组元素表示待验证数字出现的次数;9x9的数独可以分为一个3x3的大九宫格,创建一个三维数组nineSequareGrids[i][j][k]用于记录待验证数字在小九宫格中出现的次数,其中i、j表示小九宫格的位置,k表示待验证数字,数组元素表示待验证数字出现的次数。初始时,数组rows、columns、nineSequareGrids的初值均为0,遍历数独,如果每次验证时,数组元素不为零,则说明该数字在所在的行、所在的列、所在的小九宫格中已经出现,数独无效;如果每次验证时,数组元素均为0,则说明该数字在它所在的行、所在的列、所在的九宫格只出现了一次,数独有效。

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

		//rows[i][j]:表示第i行中数字j出现了rows[i][j]
		int[][] rows=new int[9][9];
		//cols[i][j]:表示第i列中数字j出现了rows[i][j]
		int[][] columns=new int[9][9];
		//nineSequareGrids[i][j][k]:表示第i行,j列的九宫格中数字k出现了rows[i][j][k]次
		int[][][] nineSequareGrids=new int[3][3][9];
		
		for(int i=0;i<9;i++){
			for (int j = 0; j < 9; j++) {
				if(board[i][j]!='.'){
					int num=board[i][j]-'1';
					
					//验证行:
					if (rows[i][num]==0) {
						//数组元素为零,则说明给数字在所在的行第一次出现,数字出现次数+1
						rows[i][num]++;
					}else {
						//数组元素不为零,则说明该数字在所在的行重复出现,数独无效
						return false;
					}
					//验证列:
					if (columns[j][num]==0) {
						//数组元素为零,则说明给数字在所在的列第一次出现,数字出现次数+1
						columns[j][num]++;
					}else {
						//数组元素不为零,则说明该数字在所在的列重复出现,数独无效
						return false;
					}
					//验证九宫格:
					if (nineSequareGrids[i/3][j/3][num]==0) {
						//数组元素为零,则说明给数字在所在的九宫格第一次出现,数字出现次数+1
						nineSequareGrids[i/3][j/3][num]++;
					}else {
						//数组元素不为零,则说明该数字在所在的九宫格重复出现,数独无效
						return false;
					}
										
				}
				
			}
			
		}
				
		return true;
		
    }

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值