• 第 308 场周赛 t4 6163. 给定条件下构造矩阵 拓扑排序


    6163. 给定条件下构造矩阵

    给你一个  整数 k ,同时给你:

    • 一个大小为 n 的二维整数数组 rowConditions ,其中 rowConditions[i] = [abovei, belowi] 和
    • 一个大小为 m 的二维整数数组 colConditions ,其中 colConditions[i] = [lefti, righti] 。

    两个数组里的整数都是 1 到 k 之间的数字。

    你需要构造一个 k x k 的矩阵,1 到 k 每个数字需要 恰好出现一次 。剩余的数字都是 0 。

    矩阵还需要满足以下条件:

    • 对于所有 0 到 n - 1 之间的下标 i ,数字 abovei 所在的  必须在数字 belowi 所在行的上面。
    • 对于所有 0 到 m - 1 之间的下标 i ,数字 lefti 所在的  必须在数字 righti 所在列的左边。

    返回满足上述要求的 任意 矩阵。如果不存在答案,返回一个空的矩阵。

    示例 1:

    输入:k = 3, rowConditions = [[1,2],[3,2]], colConditions = [[2,1],[3,2]]
    输出:[[3,0,0],[0,0,1],[0,2,0]]
    解释:上图为一个符合所有条件的矩阵。
    行要求如下:
    - 数字 1 在第 1 行,数字 2 在第 2 行,1 在 2 的上面。
    - 数字 3 在第 0 行,数字 2 在第 2 行,3 在 2 的上面。
    列要求如下:
    - 数字 2 在第 1 列,数字 1 在第 2 列,2 在 1 的左边。
    - 数字 3 在第 0 列,数字 2 在第 1 列,3 在 2 的左边。
    注意,可能有多种正确的答案。
    

    示例 2:

    输入:k = 3, rowConditions = [[1,2],[2,3],[3,1],[2,3]], colConditions = [[2,1]]
    输出:[]
    解释:由前两个条件可以得到 3 在 1 的下面,但第三个条件是 3 在 1 的上面。
    没有符合条件的矩阵存在,所以我们返回空矩阵。
    

    提示:

    • 2 <= k <= 400
    • 1 <= rowConditions.length, colConditions.length <= 1e4
    • rowConditions[i].length == colConditions[i].length == 2
    • 1 <= abovei, belowi, lefti, righti <= k
    • abovei != belowi
    • lefti != righti

     来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/build-a-matrix-with-conditions
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    做题结果

    成功,经典拓扑排序,属于很容易想的了

     方法:拓扑排序

    开始想复杂了,想着如果一行放一个不够怎么办,看了下只有1到k,那每行每列放一个就可以了,所以行列索引分开判断就完事

    1. 根据上下,左右关系构建图

    2. 图中入度为0的点,作为拓扑排序的起点

    3. BFS完成拓扑排序,逐一分配id,入度为0的点入队

    4. 如果最终有点无法入度变成0,说明有环,有环直接结束,不用再判断

    5. 拓扑分好行列索引,输出即可

    1. class Solution {
    2. public int[][] buildMatrix(int k, int[][] rowConditions, int[][] colConditions) {
    3. int[] id1 = getIndex(k,rowConditions);
    4. int[] id2 = getIndex(k,colConditions);
    5. if(id1==null||id2==null) return new int[0][0];
    6. int[][] ans = new int[k][k];
    7. for(int i = 1; i <= k; i++){
    8. ans[id1[i]][id2[i]] = i;
    9. }
    10. return ans;
    11. }
    12. private int[] getIndex(int k, int[][] rowConditions){
    13. int[] indegree = new int[k+1];
    14. Set[] graph = new HashSet[k+1];
    15. Arrays.setAll(graph,o->new HashSet<>());
    16. for(int []rowCondition:rowConditions){
    17. int a = rowCondition[0];
    18. int b = rowCondition[1];
    19. if(graph[a].add(b)){
    20. indegree[b]++;
    21. }
    22. }
    23. int[] rowIndex = new int[k+1];
    24. Queue queue = new LinkedList<>();
    25. for(int i = 1; i <= k; i++){
    26. if(indegree[i]==0) queue.offer(i);
    27. }
    28. int id = 0;
    29. while (!queue.isEmpty()){
    30. int top = queue.poll();
    31. rowIndex[top] = id++;
    32. for(Integer item:graph[top]){
    33. indegree[item]--;
    34. if(indegree[item]==0) queue.offer(item);
    35. }
    36. }
    37. for(int i =1; i < k; i++){
    38. if(indegree[i]>0) return null;
    39. }
    40. return rowIndex;
    41. }
    42. }

  • 相关阅读:
    解决九号老C(C30/C40/C60/C80)电动车坐垫感应失灵的问题
    JUC_8锁问题
    Jmeter性能测试基础系列❤
    commons-io工具包的基本使用
    CF125E. MST Company详细解答
    配置文件中的ini,json,以及lua实现方式的优劣比较
    速码!!BGP最全学习笔记:IBGP和EBGP基本配置
    71、Spring Data JPA 的 样本查询--参数作为样本去查询数据库的数据,也可以定义查询的匹配规则
    Libuv源码解析 - 主要数据结构
    MYSQL各种子查询操作总结
  • 原文地址:https://blog.csdn.net/yu_duan_hun/article/details/126574957