326. 滑动数独
描述
给定一个 3×n 的矩阵 number,并且该矩阵只含有1到9的正整数。
考虑有一个大小为 3×3 滑动窗口,从左到右遍历该矩阵 number,
那么该滑动窗口在遍历整个矩阵的过程中会有n-2个。
现在你的任务是找出这些滑动窗口是否含有1到9的所有正整数
请返回一个长度为n-2的答案数组,如果第i个滑动窗口含有1到9的所有正整数,那么答案数组的第i个元素为true,否则为false
样例 1:
输入:
[[1,2,3,2,5,7],[4,5,6,1,7,6],[7,8,9,4,8,3]]
输出:
[true,false,true,false]
解释:
第一个和第三个滑动窗口含有1到9所有数字,其他的滑动窗口不含有1到9的所有数字
public class Solution {
/**
* @param number: an only contains from 1 to 9 array
* @return: return whether or not each sliding window position contains all the numbers for 1 to 9
*/
public boolean[] SlidingWindows(int[][] number) {
// write your code here
final int windowSize = 3;
int cols = number[0].length;
boolean[] ret = new boolean[cols - windowSize + 1];
int[] counter = new int[9];
for (int i = 0; i < windowSize; i++) {
for (int j = 0; j < windowSize; j++) {
counter[number[j][i] - 1]++;
}
}
int dis = 0;
for (int count : counter) {
dis += Math.abs(count - 1);
}
ret[0] = dis == 0;
for (int i = windowSize; i < cols; i++) {
for (int j = 0; j < windowSize; j++) {
dis -= Math.abs(counter[number[j][i - windowSize] - 1] - 1);
counter[number[j][i - windowSize] - 1]--;
dis += Math.abs(counter[number[j][i - windowSize] - 1] - 1);
dis -= Math.abs(counter[number[j][i] - 1] - 1);
counter[number[j][i] - 1]++;
dis += Math.abs(counter[number[j][i] - 1] - 1);
}
ret[i - windowSize + 1] = dis == 0;
}
return ret;
}
}
最后说两句
非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~
作者水平有限,如果文章内容有不准确的地方,请指正。
希望小伙伴们都能每天进步一点点。
声明
本文由二当家的白帽子博客原创,转载请注明来源,谢谢~