2 回答

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