给定行和列的和求可行矩阵[算法题的两种思考路径]

算法题的两种思考路径

  • 前言
  • 一、给定行列和限定求可行矩阵
  • 二、分析问题,寻找思考逻辑
  • 总结
  • 参考资料

前言

对于算法题,有时没顾太多细节,凭对题型的直觉就知道用什么方法,然后求解。但碰到从未遇到过,或者说无强烈固定套路可循的算法题,就需要分析问题,并记录下来,寻找规律和思考角度,完成方案的制定。可先凭直觉解题,再凭分析把题理解透彻。

一、给定行列和限定求可行矩阵

给定行和列的和求可行矩阵[算法题的两种思考路径]_第1张图片

二、分析问题,寻找思考逻辑

// 通过整体限制,寻找局部元素的可能性。
// 有行和,有列和,找元素。
// 一维情况下,有行和,如何寻找元素(非负),先贪心分配1,最后剩一个分配最多。
// 二维情况下,有列和,如何update元素?根据当前列和缺多少来从最后元素来补。
// 核心思想就是想满足一个,再满足另一个限制,所以先满足行和,再通过计算出来的列和合元素列和值。
// 根本就不用先给1,0也是非负整数啊!毕竟只要满足限制即可,没说那里必须多必须少,合理分配满足行列限制即可。
// 先给0,后调整即可。

func restoreMatrix(rowSum []int, colSum []int) [][]int {
    m,n := len(rowSum),len(colSum)
    ans := make([][]int,m)
    // 固定行
    for i := 0;i < m;i++ {
        ans[i] = make([]int,n)

        ans[i][n - 1] = rowSum[i]
    }
    // update 列
    // 最后一列不用更新,本来就是被限制的,自然会满足要求;而且就是借助最后一列更新前面,把自己更新会出为0的bug
    for i := 0;i < n - 1;i++ {
        for j := 0;j < m;j++ {
            if ans[j][n - 1] >= colSum[i] {
                ans[j][n - 1] -= colSum[i]
                ans[j][i] = colSum[i]
                break
            }
            ans[j][i] = ans[j][n - 1]
            colSum[i] -= ans[j][n - 1]
            ans[j][n - 1] = 0
        }

    }
    return ans
}

总结

1)先第一眼凭直觉看类型找思路,有则验证+coding,无则分析+record,从分析的record中找逻辑思路;以上是两套方案。

参考资料

[1] LeetCode 给定行列的和求可行矩阵

你可能感兴趣的:(数据机构与算法,矩阵,go)