最危险情况是当你不再有新进展。

题目描述:

合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

解题代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> nums3(m + n);
int i = 0;
int j = 0;
int key = 0;
while(i < m && j < n) {
if(nums1[i] < nums2[j]){
nums3[key++] = nums1[i++];
}else{
nums3[key++] = nums2[j++];
}
}
while(i < m){
nums3[key++] = nums1[i++];
}
while(j < n){
nums3[key++] = nums2[j++];
}

nums1 = nums3;
}
};

image-20230926213549163

解读与收获:

这是一道很经典的题目,我的解题思路是创建一个vector数组nums3,它的大小是m+n,用来暂时存放合并后的数组,然后从头遍历nums1和nums2,将两者之间的较小者插入nums3中,被选择的元素所在的数组下标和nums3下标同时后移一位,循环结束后将没插入num3的剩余内容循环插入,最后将nums3赋值给nums1。

收获:

1.vector数组的创建方法:vector nums(m + n);