2 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
這個(gè)問題有點(diǎn)棘手:它不要求您對整個(gè)切片(或 mangkuk 在它自己的術(shù)語中)進(jìn)行排序;它要求您首先識別稱為 sudu 的所有連續(xù)間隔(可能有重復(fù)元素),然后對每個(gè) sudu 進(jìn)行排序。
func makeCawan(mangkuk []int) []int {
for now, n := 0, len(mangkuk); now < n; {
min := mangkuk[now]
max := min
head := now
loop:
for now++; now < n; now++ {
switch x := mangkuk[now]; {
case x < min-1 || x > max+1:
sort(mangkuk[head:now], min, max)
break loop
case x == min-1:
min = x
case x == max+1:
max = x
}
}
if now >= n {
sort(mangkuk[head:now], min, max)
}
}
return mangkuk
}
游樂場:https://play.golang.org/p/z3TGWnWnrVY

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
回答這個(gè)問題假設(shè)你想對連續(xù)和重復(fù)的 int 切片進(jìn)行排序。
簡單地對切片進(jìn)行排序是一種可讀的解決方案,但是對于長度為 n 的切片使用基于比較的排序算法需要 O(nlgn)。
我們可以使用具有 O(n) 輔助空間的性能更好的算法。算法:
1. 迭代數(shù)組 A 并找到最小值和最大值。
2. 創(chuàng)建一個(gè)長度為 max-min+1 的數(shù)組 B。
3. 遍歷 A 并將每個(gè)元素的計(jì)數(shù)存儲在 B 中,即B[A[i] - min]++
。
4. 現(xiàn)在遍歷 B 并打印 i + min
B[i] 次。
時(shí)間復(fù)雜度 - O(n)
https://play.golang.org/p/rptgMpWdKCX
請注意,此循環(huán)也是 O(n),其中 n 是實(shí)際輸入數(shù)組的長度。
for i:=0;i<len(b);i++{
for b[i] != 0{
fmt.Printf("%v ", i + min)
b[i]--
}
}
- 2 回答
- 0 關(guān)注
- 138 瀏覽
添加回答
舉報(bào)