算法之合并两个有序数组

题目描述:
给定两个有序整数数组 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万。
但是我的方法也太蠢了吧。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值