Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LeetCode] 88. Merge Sorted Array #88

Open
grandyang opened this issue May 30, 2019 · 2 comments
Open

[LeetCode] 88. Merge Sorted Array #88

grandyang opened this issue May 30, 2019 · 2 comments

Comments

@grandyang
Copy link
Owner

grandyang commented May 30, 2019

 

Given two sorted integer arrays  nums1  and  nums2 , merge  nums2  into  nums1  as one sorted array.

Note:

  • The number of elements initialized in  nums1 and  nums2  are  m  and  n  respectively.
  • You may assume that  nums1  has enough space (size that is greater or equal to  m  +  n ) to hold additional elements from  nums2.

Example:

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

Output: [1,2,2,3,5,6]

 

混合插入有序数组,由于两个数组都是有序的,所有只要按顺序比较大小即可。题目中说了 nums1 数组有足够大的空间,说明不用 resize 数组,又给了m和n,那就知道了混合之后的数组的大小,这样就从 nums1 和 nums2 数组的末尾开始一个一个比较,把较大的数,按顺序从后往前加入混合之后的数组末尾。需要三个变量 i,j,k,分别指向 nums1,nums2,和混合数组的末尾。进行 while 循环,如果i和j都大于0,再看如果 nums1[i] > nums2[j],说明要先把 nums1[i] 加入混合数组的末尾,加入后k和i都要自减1;反之就把 nums2[j] 加入混合数组的末尾,加入后k和j都要自减1。循环结束后,有可能i或者j还大于等于0,若j大于0,那么还需要继续循环,将 nums2 中的数字继续拷入 nums1。若是i大于等于0,那么就不用管,因为混合数组本身就放在 nums1 中,参见代码如下:

 

解法一: 

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

 

我们还可以写的更简洁一些,将两个 while 循环融合到一起,只要加上 i>=0 且 nums1[i] > nums2[j] 的判断条件,就可以从 nums1 中取数,否则就一直从 nums2 中取数,参见代码如下:

 

解法二:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i = m - 1, j = n - 1, k = m + n - 1;
        while (j >= 0) {
            nums1[k--] = (i >= 0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
        }
    }
};

 

Github 同步地址:

#88

 

类似题目:

Merge Sorted Array

Merge Two Sorted Lists

Squares of a Sorted Array

Interval List Intersections

 

参考资料:

https://leetcode.com/problems/merge-sorted-array/

https://leetcode.com/problems/merge-sorted-array/discuss/29572/My-simple-solution

https://leetcode.com/problems/merge-sorted-array/discuss/29515/4ms-C%2B%2B-solution-with-single-loop

 

LeetCode All in One 题目讲解汇总(持续更新中...)

@LikeUforNoReason
Copy link

用inplace_merge()来做会不会更好一点。
class Solution {
public:
void merge(vector& nums1, int m, vector& nums2, int n) {
for (int i = 0; i < n; i ++) {
nums1[i + m] = nums2[i];
}
inplace_merge(nums1.begin(), nums1.begin() + m, nums1.end());
}
};

@lld2006
Copy link

lld2006 commented Jul 24, 2020

用inplace_merge()来做会不会更好一点。
class Solution {
public:
void merge(vector& nums1, int m, vector& nums2, int n) {
for (int i = 0; i < n; i ++) {
nums1[i + m] = nums2[i];
}
inplace_merge(nums1.begin(), nums1.begin() + m, nums1.end());
}
};

看样子不会更好, 至少需要更多的空间
If enough extra memory is available, linear in the distance between first and last: Performs N-1 comparisons and up to twice that many element moves.
Otherwise, up to linearithmic: Performs up to N*log(N) element comparisons (where N is the distance above), and up to that many element swaps.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants