LeetCode刷题——合并两个有序数组(运行速度beat100%)

大家好,刷完了链表和树,来到了排序和搜索,看下题目:


思路是这样的:

如果按正常遍历,对nums2的每一位对nums1从头到尾遍历,找到合适的位置插入,这样做要移动的位数很多,时间复杂度为O(mn),且已经知道全部插入完成后nums1的长度为m+n-1.所以可以从后向前地插值。我们设置三个指针,一个temp指向nums1的第m+n-1位,一个i指向nums1的第m-1位,j指向nums2的第n-1位。将i与j的值比较,较大的那个移到temp。此外还要额外考虑一种情况,就是nums1的值全都移到temp了,nums2还有的没有插入,即nums2有的值比nums1最小的值还小。这个时候我们直接循环读入剩下的nums2的值就可以了。

代码如下:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if(m == 0 && n != 0)
            nums1 = nums2;
        int i = m - 1;
        int j = n - 1;
        int temp = m + n - 1;
        while(i >= 0 && j >= 0){
            if(nums2[j] >= nums1[i]){
                nums1[temp--] = nums2[j];
                j--;
            }
            else{
                nums1[temp--] = nums1[i];
                if(i == 0){
                    while(j >= 0){
                        nums1[temp--] = nums2[j];
                        j--; 
                    }
                    break;
                }
                else{
                    i--;
                }
            }
        }
    }
};
这种从后向前地思路也是我昨天晚上看剑指offer学到的,希望对大家有帮助,我们下期见!


猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/80334682
今日推荐