有K个长度不定的有序数组,将这些数组合并为一个有序数组。
示例:
输入: [1, 3, 5, 7], [2, 4, 6, 7], [3, 5, 6], [2], [1]
输出:[1 2 2 3 3 4 5 5 6 6]
解题思路:利用最小堆求最小值
1. 初始化一个最小度,其中最小度的元素为k;
2. 遍历数组获取第一个元素插入到最小堆中,同时记录元素在那个数组中的那个位置;
3. 删除最小堆中的最小值,并获取该数组中的下一个元素插入到堆中,如果该数组已经处理完成,则继续获取下一个元素,循环直至最小堆的元素为空;
package main
import (
"fmt"
"errors"
)
type ele struct {
v int
index int
kindex int
}
type minHeap struct {
size int
eles []*ele
}
func (m *minHeap) delEle() (*ele, error) {
if len(m.eles) <= 0 {
return nil, errors.New("minHeap empty")
}
ret := m.eles[0]
x := m.eles[m.size]
i := 0
for {
l := 2*i + 1
r := 2*i + 2
if l >= m.size {
break
}
if r < m.size && m.eles[l].v > m.eles[r].v {
l = r
}
if x.v <= m.eles[l].v {
break
}
m.eles[i] = m.eles[l]
i = l
}
m.size--
m.eles[i] = x
return ret, nil
}
func (m *minHeap) insEle(e *ele) {
m.size++
i := m.size
for i > 0 {
parent := (i - 1) / 2
if m.eles[parent].v <= e.v {
break
}
m.eles[i] = m.eles[parent]
i = parent
}
m.eles[i] = e
}
func (m *minHeap) length() int {
return m.size
}
func mergeArr(params ...[]int) []int {
k := len(params)
res := []int{}
min := &minHeap{
eles: make([]*ele, k),
size: -1,
}
// 获取数组的第一个元素插入到最小堆中
for j := 0; j < k; j++ {
if len(params) >= 1 {
min.insEle(&ele{
v: params[j][0],
index: 0,
kindex: j,
})
}
}
for min.length() > 0 {
e, _ := min.delEle()
res = append(res, e.v)
if len(params[e.kindex]) - 1 > e.index {
min.insEle(&ele{
v: params[e.kindex][e.index + 1],
index: e.index + 1,
kindex: e.kindex,
})
}
}
return res
}
func main() {
fmt.Println(mergeArr([]int{1, 3, 5, 7}, []int{2, 4, 6, 7}, []int{3, 5, 6}, []int{2}, []int{1}))
}
版权声明:本文为dadaddaddad原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。