OD C卷 - 宽度最小的子矩阵

宽度最小的子矩阵 (100)

  • 给定一个n行 * m列的矩阵;
  • 给定一个k个整数的数组k_list;
  • 在n*m的矩阵中找一个宽度最小的子矩阵,该子矩阵包含k_list中所有的整数;
    输入描述:
    第一行输入n,m 两个整数;
    后续n行每行输入 m个数据;
    输入k值;
    输入个整数
    输出描述:
    最小宽度值,若找不到,则输出-1

示例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

输入:

2 5

1 2 2 3 1

1 3 2 3 4

3

1 1 4

输出:

5
思路:

  • 滑动的子矩阵
  • 从第一列起始,找一个宽度最小的子矩阵;
  • 从第二列开始,找一个宽度最小的子矩阵;
  • 依次到最后一列...
  • 以上的宽度每次取最小值
python 复制代码
 
class MinWidth:
    def solution(self, n, m, matrix, k_list):
        k_dict = self.to_dict(k_list)
        min_width = float("inf")
        # 类似双指针
        for start_idx in range(m):
            for end_idx in range(start_idx, m):
                temp_list = []
                # 获取当前子矩阵的所有元素
                for i in range(n):
                    temp_list.extend(matrix[i][start_idx:end_idx+1])
                temp_dict = self.to_dict(temp_list)
                # 集合操作
                flag = True
                for key in k_dict:
                    if key in temp_dict and k_dict[key] <= temp_dict[key]:
                        continue
                    else:
                        flag = False
                        break

                if flag:
                    min_width = min(min_width, end_idx - start_idx + 1)
                    break
        print(min_width)

    def to_dict(self, alist):
        dict_ = {}
        for i in alist:
            dict_[i] = dict_.get(i, 0) + 1
        return dict_


if __name__ == '__main__':
    min_width = MinWidth()

    while True:
        try:
            n, m = list(map(int, input().strip().split()))
            matrix = []
            for i in range(n):
                matrix.append(list(map(int, input().strip().split())))
            k = int(input().strip())
            k_list = list(map(int, input().strip().split()))
            min_width.solution(n, m, matrix, k_list)

        except KeyboardInterrupt:
            break

&nbsp

相关推荐
yi0115 天前
LeetCode 424. 替换后的最长重复字符|不定长滑动窗口:如何判断窗口是否合法?
笔记·python·算法·leetcode·双指针·滑动窗口
yi0115 天前
LeetCode 3. 无重复字符的最长子串|不定长滑动窗口:什么时候更新最大值?
笔记·python·算法·leetcode·双指针·滑动窗口
yi0116 天前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
longlongzihan9 天前
LeetCode 76. 最小覆盖子串:滑动窗口算法详解
算法·leetcode·滑动窗口
longlongzihan14 天前
LeetCode 1004.最大连续1的个数III 滑动窗口及动态规划题解
c++·算法·leetcode·dp·滑动窗口
Logic1011 个月前
C语言/数据结构滑动窗口题解:替换k个字符后的最长连续相同字符子串(LeetCode 424)
c语言·数据结构·字符串·滑动窗口·时间复杂度·频率统计·算法题
Tisfy1 个月前
LeetCode 1477.找两个和为目标值且不重叠的子数组:滑动窗口 + 记录前值(动态规划)
动态规划·题解·dp·滑动窗口
a187927218311 个月前
【算法】双指针与滑动窗口(三):相向双指针——比较、排除、收缩
算法·leetcode·双指针·滑动窗口·原理·相向双指针·算法讲解
a187927218311 个月前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解
Evand J1 个月前
【MATLAB例程,图像滤波降噪12】加权中值滑动窗口滤波(WMF)图像降噪,包含滤波质量评价。附代码下载链接
开发语言·图像处理·人工智能·计算机视觉·matlab·滑动窗口·滤波