我一直试图解决这个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
是小矩阵。
rL
和cL
代表大矩阵的行和列。
rS
和cS
代表小矩阵的行和列。
答案 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
现在,如果您通过此阵列进行扫描,则只能看到您将搜索空间从每个可能的位置缩小到仅与您的总和相等的位置。这并不能保证阵列处于此位置,您仍然需要添加验证步骤,但会缩小搜索空间。