题目描述
给定一个矩阵,包含 N * M 个整数,和一个包含 K 个整数的数组。
现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。
输入描述
第一行输入两个正整数 N,M,表示矩阵大小。
接下来 N 行 M 列表示矩阵内容。
下一行包含一个正整数 K。
下一行包含 K 个整数,表示所需包含的数组,K 个整数可能存在重复数字。
所有输入数据小于1000。
输出描述
输出包含一个整数,表示满足要求子矩阵的最小宽度,若找不到,输出-1。
用例
输入 | 2 5 1 2 2 3 1 2 3 2 3 2 3 1 2 3 |
---|---|
输出 | 2 |
说明 | 矩阵第0、3列包含了1,2,3,矩阵第3,4列包含了1,2,3 |
输入 | 2 5 1 2 2 3 1 1 3 2 3 4 3 1 1 4 |
---|---|
输出 | 5 |
说明 | 矩阵第1、2、3、4、5列包含了1、1、4 |
题目解析
1.首先,我们需要将给定的矩阵转换为一个二维数组,以便后续操作。
2.然后,我们需要找到包含所需整数的子矩阵。为了实现这一点,我们可以使用滑动窗口的方法。我们从矩阵的第一列开始,逐步向右移动窗口,直到找到一个包含所有所需整数的子矩阵。在每次移动窗口时,我们需要检查当前窗口是否包含所有所需整数。如果包含,则更新最小宽度;如果不包含,则继续向右移动窗口。
3.最后,输出满足要求的子矩阵的最小宽度。如果没有找到满足要求的子矩阵,则输出-1。
JS算法源码
const rl = require("readline").createInterface({ input: process.stdin });
const iter = rl[Symbol.asyncIterator]();
const readline = async