2018年LeetCode高频算法面试题刷题笔记——合并两个有序数组(开始之前)

1.解答之前的碎碎念:

这道题拿到手第一时间想到的就是插入排序,不过插入排序时间复杂度为O(n^2),实在是太高了。。。当然,这道题对复杂度没有要求,不过还是尽量想一个时间复杂度低一点的算法比较好~

2.问题描述:

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

说明:

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

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

3.解答思路:

参考链接:https://www.jianshu.com/p/88203168eb42

摘录:

提示中已经给出,假设array1有足够的空间了,于是我们不需要额外构造一个数组,并且可以从后面不断地比较元素进行合并。

  • 比较array2与array1中最后面的那个元素,把最大的插入第m+n位
  • 改变数组的索引,再次进行上面的比较,把最大的元素插入到array1中的第m+n-1位。
  • 循环一直到结束。循环结束条件:当index1或index2有一个小于0时,此时就可以结束循环了。如果index2小于0,说明目的达到了。如果index1小于0,就把array2中剩下的前面的元素都复制到array1中去就行。

特殊输入情况:

  • 当array1为空,array2不为空时,将array2的所有元素添加到array1中即可
  • 当array1不为空,array2为空时,就是上面的循环结束条件,直接返回array1.
  • 当array1跟array2都为空时,返回空。

 

重点:一般这种合并有序的序列,思路应该都是从后向前合并。

4.答案:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if(m == 0)
        {
            for(int i = 0;i < n;i++)
            {
                nums1[i] = nums2[i]; 
            }
        }
        else
        {
            int count1 = m - 1;
            int count2 = n - 1;
        
            while(count1 >= 0 && count2 >= 0)
            {
                if(nums1[count1] > nums2[count2])
                {
                    nums1[count1 + count2 + 1] = nums1[count1];
                    count1--;
                }
                else 
                {
                    nums1[count1 + count2 + 1] = nums2[count2];
                    count2--;
                }
            }
            if(count1 < 0)
            {
                for(int i = 0;i <= count2;i++)
                {
                    nums1[i] = nums2[i]; 
                }
            }
        }
        
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值