Golang代码对于Hackerrank来说太慢了

时间:2015-09-18 13:20:25

标签: algorithm performance go

我一直试图解决这个Hackerrank挑战:Link

这就是你要做的事情:

你有一个大矩阵:

1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 0 1 1

和一个小矩阵:

1 1 1
1 1 1
1 1 0

你必须找出大矩阵中是否存在小矩阵。

最多有5个测试用例,每个矩阵最大可达1000x1000,我需要在4秒内解决这个问题。

对于最大可能输入的代码超时,我想也许我扫描矩阵的方式太慢了。

这是我的代码:

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    var t, rL, cL, rS, cS, temp int
    var s string
    var sl []string
    var mxL, mxS [][]int
    var found bool
    fmt.Scanf("%d", &t)
    for ; t > 0; t-- {
        // Start scanning input
        // Scanning large matrix
        fmt.Scanf("%d%d", &rL, &cL)
        mxL = make([][]int, rL)
        for i := range mxL {
            mxL[i] = make([]int, cL)
        }
        for i := 0; i < rL; i++ {
            fmt.Scanf("%s", &s)
            sl = strings.Split(s, "")
            for j, v := range sl {
                temp, _ = strconv.Atoi(v)
                mxL[i][j] = temp
            }
        }
        // Scanning small matrix
        fmt.Scanf("%d%d", &rS, &cS)
        mxS = make([][]int, rS)
        for i := range mxS {
            mxS[i] = make([]int, cS)
        }
        for i := 0; i < rS; i++ {
            fmt.Scanf("%s", &s)
            sl = strings.Split(s, "")
            for j, v := range sl {
                temp, _ = strconv.Atoi(v)
                mxS[i][j] = temp
            }
        }
        // Stop scanning input
        // Start searching for small matrix in large matrix
        found = true
        for iL := 0; iL <= rL-rS; iL++ {
            for jL := 0; jL <= cL-cS; jL++ {
                found = true
                if mxL[iL][jL] == mxS[0][0] {
                    for iS := 0; iS < rS; iS++ {
                        for jS := 1; jS < cS; jS++ {
                            if mxS[iS][jS] != mxL[iS+iL][jS+jL] {
                                found = false
                                break
                            }
                        }
                        if !found {
                            break
                        }
                    }
                    if found {
                        break
                    }
                } else {
                    found = false
                }
            }
            if found {
                fmt.Println("YES")
                break
            }
        }
        if !found {
            fmt.Println("NO")
        }
        // Stop searching for small matrix in large matrix
    }
}

我使用一片切片来存储输入。

mxL是大矩阵,mxS是小矩阵。

rLcL代表大矩阵的行和列。

rScS代表小矩阵的行和列。

1 个答案:

答案 0 :(得分:2)

好吧,我会向你指出一个想法,然后你可以尝试实现它。因此,创建一个与大型数组一样大的新二维数组。称之为sumArray。现在让sumArray中的每个单元格表示当前单元格是最左下角单元格的总和。现在你要做的是只检查与你的小数组具有相同总和的单元格,而不是检查数组中的每个元素。

所以如果那些是你的输入

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$tags = $xpath->query('//div[@class="text"]');
foreach ($tags as $tag) {
    echo $dom->saveHTML( $tag );
}

首先总结你的小数组 - &gt; 8

现在让我告诉你你的sum数组是什么样子

1 1 1 1 1 1     
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 0 1 1

1 1 1
1 1 1
1 1 0

现在,如果您通过此阵列进行扫描,则只能看到您将搜索空间从每个可能的位置缩小到仅与您的总和相等的位置。这并不能保证阵列处于此位置,您仍然需要添加验证步骤,但会缩小搜索空间。