数组合并
条件:
- 两个数组分别已经升序排列
要求:
- 合并两个数组并返回新的已经排序后的数组
分析该题目,其要求与归并排序的实现思想相同
归并排序的算法中,使用“分治”策略,而这道题的实现逻辑,仅需要用到归并算法中的“治”
实现一
fun mergeArray(first: Array<Int>, sec: Array<Int>): Array<Int> {
val temp = Array(first.size + sec.size) { 0 }
var t = 0
var i = 0
var j = 0
// 取较短的数组作为loop条件
var mid = if (first.size <= sec.size) first.size - 1 else sec.size - 1
while (i <= mid && j <= mid) {
//关键的逻辑在于这行
temp[t++] = if (first[i] < sec[j]) first[i++] else sec[j++]
}
// 将first数组中剩余的元素追加到temp
while (i <= first.size - 1) {
temp[t++] = first[i++]
}
// 将sec数组中剩余的元素追加到temp
while (j <= sec.size - 1) {
temp[t++] = sec[j++]
}
return temp
}
实现二
前面的实现,并未能去除重复的元素,增加题目的要求
- 合并后的数组,如果包含相同元素,则只保留一个
fun mergeArray(first: Array<Int>, sec: Array<Int>): Array<Int> {
val temp = Array(first.size + sec.size) { 0 }
var t = 0
var i = 0
var j = 0
var k: Int
// 取较短的数组开始loop
var mid = if (first.size <= sec.size) first.size - 1 else sec.size - 1
while (i <= mid && j <= mid) {
//关键的逻辑在于这行
k = if (first[i] < sec[j]) first[i++] else sec[j++]
//过滤重复元素
if (t > 0 && k == temp[t - 1]) continue
temp[t++] = k
}
// 将first数组中剩余的元素追加到temp
while (i <= first.size - 1) {
k = first[i++]
if (t > 0 && k == temp[t - 1]) continue
temp[t++] = k
}
// 将sec数组中剩余的元素追加到temp
while (j <= sec.size - 1) {
k = sec[j++]
if (t > 0 && k == temp[t - 1]) continue
temp[t++] = k
}
return temp
}
多路合并
以上的数组合并只是两个数组,继续引申出,多个有序数组进行合并,并去重排序;