第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

減少Go中數(shù)字和代碼的處理時(shí)間

減少Go中數(shù)字和代碼的處理時(shí)間

Go
慕工程0101907 2022-11-08 16:01:11
我寫了這段代碼,但是代碼測(cè)試站點(diǎn)由于處理時(shí)間而被拒絕。為了減少時(shí)間,我使用了兩個(gè)指針?biāo)惴ê?Goroutine(我不確定我是否正確使用它)。但該網(wǎng)站仍然以同樣的原因被拒絕。有什么改進(jìn)的解決方案可以通過嗎?如何減少處理時(shí)間。請(qǐng)查看我的代碼。謝謝您的支持!問題描述N 個(gè)數(shù)的序列 A[1], A[2], ... , A[N] 存在。在這個(gè)序列中從 i 到 j 的數(shù)字之和 A[i]+A[i+1]+... 編寫程序求 +A[j-1]+A[j] 變?yōu)?M 的情況的數(shù)量。輸入在第一行中,給出了 N(1≤N≤10,000) 和 M(1≤M≤300,000,000)。下一行包含 A[1], A[2], ... , A[N] 是給定的,用空格分隔。每個(gè) A[x] 是一個(gè)不超過 30,000 的自然數(shù)。打印第一行的病例數(shù)。例子輸入 1:4 21 1 1 1輸出 1:3輸入 2:10 51 2 3 4 2 5 3 1 1 2輸出 2:3package mainimport "fmt"func main() {    var n int //numbers    var m int //target sum    c := make(chan []int)    d := make(chan int)    fmt.Scanf("%d %d\n", &n, &m)    arr := make([]int, n)    go ReadN(arr, n, c)    go checker(<-c, n, m, d)    fmt.Print(<-d)}func ReadN(arr []int, n int, c chan<- []int) {    for i := 0; i < n; i++ {        fmt.Scan(&arr[i])    }    c <- arr}func checker(arr []int, n, m int, d chan<- int) {    var start int    var end int    var sum int    var result int    for start < n {        if sum > m || end == n {            sum -= arr[start]            start++        } else {            sum += arr[end]            end++        }        if sum == m {            result++        }    }    d <- result}
查看完整描述

2 回答

?
月關(guān)寶盒

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊

問題來(lái)自 Scan 和 Scanf。它不做任何緩沖,如果你得到大量輸入,它會(huì)非常慢。于是我把所有的Scan、Scanf改成了Fscan、Fscanf。相反,我使用了 bufio 包。但是,如果您對(duì)即使使用 Fscanf() 的速度也不滿意,您應(yīng)該認(rèn)真考慮使用 Scanner。請(qǐng)參見下面的代碼。


package main


import (

    "bufio"

    "fmt"

    "os"

)


func main() {

    var n int //numbers

    var m int //target sum

    var bufin *bufio.Reader = bufio.NewReader(os.Stdin)


    fmt.Fscanf(bufin, "%d %d\n", &n, &m)

    arr := make([]int, n)

    arr = ReadN(arr, n, bufin)

    result := checker(arr, n, m)

    fmt.Print(bufout, result)

}


func ReadN(arr []int, n int, bufin *bufio.Reader) []int {

    for i := 0; i < n; i++ {

        fmt.Fscan(bufin, &arr[i])

    }

    return arr

}


func checker(arr []int, n, m int) int {

    var start int

    var end int

    var sum int

    var result int


    for start < n {

        if sum > m || end == n {

            sum -= arr[start]

            start++

        } else {

            sum += arr[end]

            end++

        }

        if sum == m {

            result++

        }

    }

    return result

}


查看完整回答
反對(duì) 回復(fù) 2022-11-08
?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

您可以使用前綴和算法解決此類問題,該算法可以在 O(n) 時(shí)間和空間內(nèi)完成。你也可以參考這篇文章

有關(guān)此類問題的練習(xí),請(qǐng)參閱


查看完整回答
反對(duì) 回復(fù) 2022-11-08
  • 2 回答
  • 0 關(guān)注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)