力扣日常练习

合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

解题:

首先这道题最直接的方法当然是合并后直接排序,但是这么处理的时间复杂度会成为排序的时间复杂度即O(log(m+n)),因此我们不能止步于此,需要想出更好的解决方案。因此我们想出双指针的办法,从而达到O(m+n)的时间复杂度,我们将指针p1置于有效数组nums1的末尾(即nums1[m-1]),将指针p2置于数组nums2的末尾(即nums2[n-1]),此时再定义一个指针p3指向数组nums1的最后(即nums1[n+m-1]),接下来不断将较大的数依次从后往前放置到nums1数组中。

代码下面的for循环和while循环表示将数组nums2中剩余的元素全部移动到nums1中完成收尾工作,但是感觉用r循环不够优雅,因此改成了copy函数,使得代码风格更加简洁。

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = m - 1;
        int p2 = n - 1;
        int p3 = m + n - 1;
        while(p1 >=0 && p2 >= 0) {
            nums1[p1] >=nums2[p2] ? nums1[p3--] = nums1[p1--] : nums1[p3--] = nums2[p2--];
        }
        // for(int i = 0; i <= p2; ++i) {
        //     nums1[i] = nums2[i];
        // }
        // while(p2 >= 0) {
        //     nums1[p2] = nums2[p2];
        //     --p2;
        // }
        if(p2 >= 0)
            copy(nums2.begin(), nums2.begin() + p2 + 1, nums1.begin());
    }
};

不做了

发布了41 篇原创文章 · 获赞 42 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览