题目描述:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
我的解法:
真的是太沙雕了。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i;
int j;
int sum=0; //记录交换次数
for(i=0;i<m;i++) //用元素互换,将两组元素较小的值都放到nums1,并且有序
{
for(j=0;j<n;j++)
{
if(nums1[i]>nums2[j])
{
int temp=nums1[i];
nums1[i]=nums2[j];
nums2[j]=temp;
sum++;
}
else
break;
}
}
if(sum == 0)
{
for(int k=m;k<m+n;k++)
nums1[k]=nums2[k-m];
}
else
{
for(int x=0;x<n;x++) //nums2选择排序
{
int min = nums2[x];
int tab = x;
for(int y=x+1;y<n;y++)
{
if(nums2[y]<min)
{
min = nums2[y];
tab=y;
}
}
nums2[tab]=nums2[x];
nums2[x]=min;
}
}
for(int k=m;k<m+n;k++) //合并数组
nums1[k]=nums2[k-m];
for(int l=0;l<m+n;l++)
cout << nums1[l]<<endl;
}
};
好的方法:
将两个数组从末尾开始往前比较,比完之后放在nums1的最后
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int max=m+n-1;
int i=m-1;
int j=n-1;
while(i>=0&&j>=0)
{
if(nums1[i]>nums2[j])
{
nums1[max--]=nums1[i--];
}
else
{
nums1[max--]=nums2[j--];
}
}
if(j>=0)
{
for(;j>=0;j--)
nums1[j]=nums2[j];
}
for(int k=0;k<m+n;k++)
cout<<nums1[k]<< ",";
}
};
今天排名26万。
但是我的方法也太蠢了吧。