天池 在线编程 滑动数独(滑动窗口)

文章目录

1. 题目

描述
给定一个 3xn的矩阵 number,并且该矩阵只含有1到9的正整数。
考虑有一个大小为 3x3 滑动窗口,从左到右遍历该矩阵 number, 那么该滑动窗口在遍历整个矩阵的过程中会有n-2个。

现在你的任务是找出这些滑动窗口是否含有1到9的所有正整数
请返回一个长度为n-2的答案数组,如果第 i 个滑动窗口含有1到9的所有正整数,那么答案数组的第 i 个元素为true,否则为false

示例

输入:[[1,2,3,2,5,7],[4,5,6,1,7,6],[7,8,9,4,8,3]]
输出:[true,false,true,false]
解释:第一个和第三个滑动窗口含有19所有数字,
	其他的滑动窗口不含有19的所有数字

来源:https://tianchi.aliyun.com/oj/141744976105873771/153295019687743571

2. 解题

class Solution {
public:
    /**
     * @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 
     */
    vector<bool> SlidingWindows(vector<vector<int>> &number) {
        // write your code here
        int n = number[0].size();
        vector<bool> ans(n-2, false);
        vector<int> flag(10, 0);
        for(int i = 0; i < 3; i++)
        {
            for(int k = 0; k < 2; k++)
            {	//前3行,2列的数字的个数
                flag[number[i][k]]++;
            }
        }
        for(int j = 2; j < n; j++) 
        {	//右端点 的列加入
            for(int i = 0; i < 3; i++)
            {
                flag[number[i][j]]++;
            }
            bool res = true;
            for(int x = 1; x <= 9; x++)
            {	//检查1-9 是不是都是1个
                if(flag[x] != 1)
                {
                    res = false;
                    break;
                }
            }
            ans[j-2] = res;
            for(int i = 0; i < 3; i++)
            {	// 左端点的列 j-2列 计数减去
                flag[number[i][j-2]]--;
            }
        }
        return ans;
    }
};

603ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页