1、算法描述:
有兩個有序的整型數組arrayA,和arrayB,先要將它倆合并得到新的合并數組同樣是有序的。
示例:
arrayA = [0, 1 , 3 , 4 , 6] //count = 5
arrayB = [2 , 3, 3 , 6 , 8 , 9 , 10] //count = 7
合并后:
array = [0, 1, 2, 3, 3, 3, 4, 6, 6, 8, 9, 10]
2、解答思路:
1)、非法判定:
對于非法輸入進行返回;
2)、合法輸入:
將兩個數組都按從后往前(或者從前往后)一個元素一個元素取出進行比較
設置兩個索引indexA和indexB,分別表示數組A和B當前取出的元素,進行比較,當某一個索引小于0,即下次訪問要發生數組越界,此時一個數組所有元素已經全部比較完畢,但是另一個數組此時可能還有元素沒有參加比對,多出的這些元素直接拼接到合并的數組里面。
3、實現:
class MergeTwoOrderedArrays {
func merge(arr1 : [Int] , arr2 : [Int]) -> [Int]? {
var indexA : Int = arr1.count - 1
var indexB : Int = arr2.count - 1
//合法判定
if indexA < 0 {
return arr2;
} else if indexB < 0 {
return arr1;
}
//生成存放數據的數組,注意此時的index并不是數組A元素個數加數組B元素個數,而是要減一
var indexC : Int = indexA + indexB + 1 //index要比數組大小小1
var array : [Int] = [Int](repeating: 0, count: indexC + 1) //count為數組A元素個數加數組B的元素個數
while ( indexA >= 0 && indexB >= 0 ) {//判定哪個數組元素最先比較完成
if arr1[indexA] > arr2[indexB] {
array[indexC] = arr1[indexA]
indexC -= 1
indexA -= 1
}
else {
array[indexC] = arr2[indexB]
indexC -= 1
indexB -= 1
}
}
while indexA >= 0 {//多余元素拼接
array[indexC] = arr1[indexA]
indexC -= 1
indexA -= 1
}
while indexB >= 0 {//多余元素拼接
array[indexC] = arr2[indexB]
indexC -= 1
indexB -= 1
}
return array
}
}
//測試
let test = MergeTwoOrderedArrays()
test.merge(arr1: [0, 1 , 3 , 4 , 6], arr2: [2 , 3, 3 , 6 , 8 , 9 , 10])
//結果
[0, 1, 2, 3, 3, 3, 4, 6, 6, 8, 9, 10]
上面使用的是從后往前一個一個遍歷比較的方法,當然也可以從前往后一個一個遍歷比較,看誰先到達數組的結尾。
4、分析:
1)、時間復雜度:
while ( indexA >= 0 && indexB >= 0 )
循環最多循環次數是m+n次,所以時間復雜度為O(n)
2)、空間復雜度:
需要零時占用的空間為m+n,所以空間復雜度為O(n)