簡體   English   中英

Golang代碼對於Hackerrank太慢

[英]Golang code too slow for Hackerrank

我一直在嘗試解決這一Hackerrank挑戰: 鏈接

這是您要做的:

您有一個大矩陣:

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
    }
}

我正在使用一片int切片來存儲輸入。

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

rLcL代表大型矩陣的行和列。

rScS代表小矩陣的行和列。

好吧,我要向您指出一個想法,然后您可以嘗試實現它。 因此,創建一個與大型陣列一樣大的新2d陣列。 稱之為sumArray。 現在,讓此sumArray中的每個單元格代表總和,其中當前單元格是最左下角的單元格。 現在,您要做的是僅檢查與小數組具有相同總和的單元格,而不是檢查數組中的每個元素。

因此,如果這些是您的投入

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

首先將你的小數組求和-> 8

現在讓我向您展示您的sum數組如何

-1 -1 -1 -1 -1 -1     -1 means that we can't sum at this point because
-1 -1 -1 -1 -1 -1      the dimensions are just smaller than your small array
-1 -1  9  9  9  9      each other cell represent the sum of your original 
 9  9  9  9  9  9      matrix values.
 9  9  9  8  9  9

現在,如果僅通過該陣列進行掃描,則可以看到將搜索空間從每個可能的位置減少到僅等於和的位置。 這不能保證陣列處於此位置,您仍然必須添加驗證步驟,但是會減少搜索空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM