我寫了這段代碼,但是代碼測驗站點由于處理時間而被拒絕。為了減少時間,我使用了兩個指標演算法和 Goroutine(我不確定我是否正確使用它)。但該網站仍然以同樣的原因被拒絕。有什么改進的解決方案可以通過嗎?如何減少處理時間。請查看我的代碼。謝謝您的支持!
問題描述
N 個數的序列 A[1], A[2], ... , A[N] 存在。在這個序列中從 i 到 j 的數字之和 A[i] A[i 1] ... 撰寫程式求 A[j-1] A[j] 變為 M 的情況的數量。
輸入
在第一行中,給出了 N(1≤N≤10,000) 和 M(1≤M≤300,000,000)。下一行包含 A[1], A[2], ... , A[N] 是給定的,用空格分隔。每個 A[x] 是一個不超過 30,000 的自然數。
列印
第一行的病例數。
例子
輸入 1:
4 2
1 1 1 1
輸出 1:
3
輸入 2:
10 5
1 2 3 4 2 5 3 1 1 2
輸出 2:
3
package main
import "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
}
uj5u.com熱心網友回復:
問題來自 Scan 和 Scanf。它不做任何緩沖,如果你得到大量輸入,它會非常慢。于是我把所有的Scan、Scanf改成了Fscan、Fscanf。相反,我使用了 bufio 包。但是,如果您對即使使用 Fscanf() 的速度也不滿意,您應該認真考慮使用 Scanner。請參見下面的代碼。
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
}
uj5u.com熱心網友回復:
您可以使用前綴和演算法解決此類問題,該演算法可以在 O(n) 時間和空間內完成。你也可以參考這篇文章。
有關此類問題的練習,請參閱此
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424123.html
下一篇:程式從通道列印錯誤的變數
