func main() {
iChan1 := make(chan bool, 1)
iChan2 := make(chan bool, 1)
iChan3 := make(chan bool, 2)
iChan2 <- true
go print1(iChan1, iChan2, iChan3)
go print2(iChan1, iChan2, iChan3)
for i := 0; i < 2; i++ {
<-iChan3
}
}
func print1(iChan1 chan bool, iChan2 chan bool, iChan3 chan bool) {
s1 := []string{"字", "跳", "2", "2"}
for _, v := range s1 {
<-iChan2
fmt.Print(v)
iChan1 <- true
}
iChan3 <- true
}
func print2(iChan1 chan bool, iChan2 chan bool, iChan3 chan bool) {
s2 := []string{"节", "动", "0", "2"}
for _, v := range s2 {
<-iChan1
fmt.Print(v)
iChan2 <- true
}
iChan3 <- true
}
/思路解析:这里使用优先队列,即创建小根堆
type Node struct {
row int
col int
val int
}
type NodeHeap []Node
func (h NodeHeap) Len() int{
return len(h)
}
func (h NodeHeap) Less(i, j int) bool{
return h[i].val < h[j].val
}
func (h NodeHeap) Swap(i, j int) {
h[i], h[j] = h[j], h[i]
}
func (h *NodeHeap) Push(x interface{}) {
*h = append(*h, x.(Node))
}
func (h *NodeHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n-1]
*h = old[0: n-1]
return x
}
func mergekSortedArrays (arrays [][]int) []int {
h := &NodeHeap{}
heap.Init(h)
ans := []int{}
for i := 0; i < len(arrays); i++{
node := &Node{
row: i,
col: 0,
val: arrays[i][0],
}
heap.Push(h, *node)
}
for h.Len() != 0{
n := heap.Pop(h)
ans = append(ans, n.(Node).val)
if n.(Node).col+1 < len(arrays[n.(Node).row]) {
newNode := &Node{
row: n.(Node).row,
col: n.(Node).col+1,
val: arrays[n.(Node).row][n.(Node).col+1],
}
heap.Push(h,*newNode)
}
}
return ans
}
func main(){
arrays := [][]int{{1,3,5,7},{2,4,6},{0,8,9,10,11}}
fmt.Println(mergekSortedArrays(arrays))
}