【題目描述】
給定兩個(gè)有序整數(shù)數(shù)組 nums1 和 nums2,將 nums2 合并到 nums1 中奄妨,使得 num1 成為一個(gè)有序數(shù)組。
初始化 nums1 和 nums2 的元素?cái)?shù)量分別為 m 和 n。
你可以假設(shè) nums1 有足夠的空間(空間大小大于或等于 m + n)來(lái)保存 nums2 中的元素。
【示例】
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
【思路1】
1严嗜、先合并再排序
2、時(shí)間復(fù)雜度O((n+m)log(n+m))
3洲敢、空間復(fù)雜度O(1)
func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
nums1.append(contentsOf: nums2)
nums1.removeAll { (i) -> Bool in
i == 0
}
nums1.sort()
}
【思路2】
1漫玄、使用雙指針
2、給出的兩個(gè)數(shù)組是有序的
3压彭、從后往前遍歷,比較num1 num2最后邊的元素大小
4睦优、大的放到num1的最后邊
5、遍歷完后壮不,看看num2數(shù)組是否遍歷完汗盘,沒(méi)遍歷完就把num2剩余的元素添加到num1的前邊,因?yàn)樗麄兪亲钚〉?br>
6询一、時(shí)間復(fù)雜度O(n+m)
7隐孽、空間復(fù)雜度O(1)
Swift代碼實(shí)現(xiàn):
func merge(_ nums1: inout [Int], _ m: Int, _ nums2: [Int], _ n: Int) {
var len = m+n-1
var len1 = m-1
var len2 = n-1
while len1 >= 0 && len2 >= 0 {
if nums1[len1] > nums2[len2] {
nums1[len] = nums1[len1]
len1-=1
} else {
nums1[len] = nums2[len2]
len2-=1
}
len-=1
}
while len2 >= 0 {
nums1[len2] = nums2[len2]
len2-=1
}
}