题目:
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
思路一:
将数组 nums2 直接放到 nums1 的后面,然后对nums1数组进行排序即可。
代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 先插入,再排序
int i = 0;
for(i = m; i < nums1.size(); i++){
nums1[i] = nums2[i-m];
}
sort(nums1.begin(), nums1.end());
}
};
运行结果
知识点回顾
排序函数sort的用法
算法初步——排序——sort函数_算法排序用什么函数表示_52Tiramisu的博客-CSDN博客
使用 sort函数,必须在文件的头部添加
#include <algorithm>
using namespace std;
sort函数的格式:
sort ( 首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填) );
思路二:使用双指针,
建立一个新数组,比较两个数组,将较小元素插入到新数组中。
把p==m和q==n放在前面的原因:
如果它们已经到各自的边界值时,则不可以在比较它们的值,因为nums1中扩充元素都为0,0当然是小于另一个数组的对应值,不可以把这些0填入到新数组吧!
代码
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 建立一个新数组,比较之后存入新的值
// 建立两个指针,分别指向两个数组nums1和nums2,往后遍历并比较
vector<int> num;
num.resize(nums1.size());
// 定义三个数组的指针
int p = 0, q = 0;
int k = 0;
// 遍历&比较
while(p != m || q != n){
if(p == m){
num[k] = nums2[q];
q++;
}else if(q == n){
num[k] = nums1[p];
p++;
}else if(nums1[p] <= nums2[q]){
num[k] = nums1[p];
p++;
}else if(nums2[q] < nums1[p]){
num[k] = nums2[q];
q++;
}
k++;
}
// 把新数组的元素拷贝到nums1中, 数组可以直接拷贝嘛?
int i = 0;
for(i = 0; i < num.size(); i++){
nums1[i] = num[i];
}
}
};
运行结果
为啥效果比上面的还要差了呢?
如果在赋值的时候,先把值存起来,然后再赋值,执行效果就会出现如下这样的效果:
是不是很amz哈哈哈