题目描述:
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
进阶:你可以设计实现一个时间复杂度为 O(m + n)
的算法解决此问题吗?
题解:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i;
int j=0;
int k=0;
vector<int> nums;
nums.resize(m+n);//出错点
for(i=0;i<m+n;i++){
if(j<m && k<n ){//出错点
if(nums1[j]<nums2[k]&&j<m){
nums[i]=nums1[j];
j++;
}else{
nums[i]=nums2[k];
k++;
}
}
else if(j>=m && k<n){
nums[i]=nums2[k];
k++;
}
else if(j<m && k>=n){//出错点
nums[i]=nums1[j];
j++;
}
else{
break;
}
}
for(i=0;i<m+n;i++){
nums1[i]=nums[i];
}
}
};
解题思路 :
将两个数组同时从前向后遍历元素并比较,选取较小的元素放进备用数组中,直到数组元素全部比较结束。
出错点:
1.vector在还没有分配任何空间时还不能像数组一样用下标形式去访问vector的(v[0]也不行)!!!否则编译通过但报运行错误runtime error!
通过使用vector的resize函数确定nums数组大小
vector<int> nums;
nums.resize(m+n);
2. 没有考虑nums1数组后n位为0,可以分情况讨论 j,k
3.nums2数组大小为0情况处理: 属于k>=0情况
方法2:先将数组nums2放进数组nums1的尾部,然后直接对整个数组进行排序。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i=0;i<n;i++){
nums1[m+i]=nums2[i];
}
sort(nums1.begin(),nums1.end());
}
};
sort (nums.begin( ) , nums.end( ));
默认: 两个参数first
,last
,将[first, last)
区间内元素升序排列。